JAXB 绑定编译器将一个 W3C XML 模式翻译成一个或多个 Java 类、一个 jaxb.properties 文件,以及可能的一些资源文件。JAXB 还提供了一种从注解的 Java 类中生成模式的方法。

Spring 支持 JAXB 2.0 API 作为 XML 编排策略,遵循 Marshaller 和 Unmarshaller 中描述的接口。相应的集成类位于 org.springframework.oxm.jaxb包中。

使用 Jaxb2Marshaller

Using Jaxb2Marshaller

Jaxb2Marshaller 类同时实现了 Spring 的 Marshaller 和 Unmarshaller 接口。它需要一个上下文路径来操作。你可以通过设置 contextPath 属性来设置上下文路径。上下文路径是一个用冒号分隔的 Java 包名的列表,其中包含模式派生类。它还提供一个 classesToBeBound 属性,允许你设置一个由 marshaller 支持的类数组。模式验证是通过向 Bean 指定一个或多个模式资源来进行的,如下面的例子所示:

  1. <beans>
  2. <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
  3. <!-- 设置哪些类支持序列化 -->
  4. <property name="classesToBeBound">
  5. <list>
  6. <value>org.springframework.oxm.jaxb.Flight</value>
  7. <value>org.springframework.oxm.jaxb.Flights</value>
  8. </list>
  9. </property>
  10. <!-- 设置验证资源 -->
  11. <property name="schema" value="classpath:org/springframework/oxm/config/spring-oxm.xsd"/>
  12. </bean>
  13. ...
  14. </beans>

:::tips

  • classesToBeBound 中写的是支持序列化的类路径,这个类还需要被 @XmlRootElement 注解

schema 也要指定,但是不知道这个里面指定什么。

  • schema:设置的是这个类序列化/反序列化的时候,进行验证。意思就是说,需要对你自己的类进行编写 xsd

所以这个看上去还是挺麻烦的。如果要使用还是需要进一步深入了解 ::: 要配合 jaxb-api 包使用

  1. implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.4.0-b180830.0359'

XML 配置命名空间

jaxb2-marshaller 元素配置了一个 org.springframework.oxm.jaxb.Jaxb2Marshaller,如下例所示:

  1. <oxm:jaxb2-marshaller id="marshaller" contextPath="org.springframework.ws.samples.airline.schema"/>

另外,你也可以通过使用 class-to-be-bound 子元素来提供要绑定到 marshaller 的类的列表:

  1. <oxm:jaxb2-marshaller id="marshaller">
  2. <oxm:class-to-be-bound name="org.springframework.ws.samples.airline.schema.Airport"/>
  3. <oxm:class-to-be-bound name="org.springframework.ws.samples.airline.schema.Flight"/>
  4. ...
  5. </oxm:jaxb2-marshaller>

下表描述了可用的属性:

Attribute Description Required
id The ID of the marshaller No
contextPath The JAXB Context path No