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 指定一个或多个模式资源来进行的,如下面的例子所示:
<beans>
<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<!-- 设置哪些类支持序列化 -->
<property name="classesToBeBound">
<list>
<value>org.springframework.oxm.jaxb.Flight</value>
<value>org.springframework.oxm.jaxb.Flights</value>
</list>
</property>
<!-- 设置验证资源 -->
<property name="schema" value="classpath:org/springframework/oxm/config/spring-oxm.xsd"/>
</bean>
...
</beans>
:::tips
- classesToBeBound 中写的是支持序列化的类路径,这个类还需要被 @XmlRootElement 注解
schema 也要指定,但是不知道这个里面指定什么。
- schema:设置的是这个类序列化/反序列化的时候,进行验证。意思就是说,需要对你自己的类进行编写 xsd
所以这个看上去还是挺麻烦的。如果要使用还是需要进一步深入了解 ::: 要配合 jaxb-api 包使用
implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.4.0-b180830.0359'
XML 配置命名空间
jaxb2-marshaller 元素配置了一个 org.springframework.oxm.jaxb.Jaxb2Marshaller,如下例所示:
<oxm:jaxb2-marshaller id="marshaller" contextPath="org.springframework.ws.samples.airline.schema"/>
另外,你也可以通过使用 class-to-be-bound 子元素来提供要绑定到 marshaller 的类的列表:
<oxm:jaxb2-marshaller id="marshaller">
<oxm:class-to-be-bound name="org.springframework.ws.samples.airline.schema.Airport"/>
<oxm:class-to-be-bound name="org.springframework.ws.samples.airline.schema.Flight"/>
...
</oxm:jaxb2-marshaller>
下表描述了可用的属性:
Attribute | Description | Required |
---|---|---|
id | The ID of the marshaller | No |
contextPath | The JAXB Context path | No |