最终有两个问题需要解决:
- 同时注入 JAXB 和 Castor marshaller/unmarshaller
- 确定何时使用 JAXB 或 Castor
Item #1 - 同时注入 JAXB 和 Castor marshaller/unmarshaller
org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter只有一个 marshaller 属性和一个 unmarshaller 属性。解决这个问题可能有两种方法:
选项 #1 - 子类 GenericMarshallingMethodEndpointAdapter
您可以继承 rg.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter 并引入第二个 marshaller 和 unmarshaller 属性。然后,您将配置如下:
<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPath" value="com.example"/>
</bean>
<bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller">
<property name="mappingLocation">
<value>classpath:config/service/mapping.xml</value>
</property>
</bean>
<bean
class="your.domain.YourGenericMarshallingMethodEndpointAdapter">
<property name="marshaller" ref="jaxbMarshaller" />
<property name="unmarshaller" ref="jaxbMarshaller" />
<property name="castorMarshaller" ref="castorMarshaller" />
<property name="castorMarshaller" ref="castorMarshaller" />
</bean>
选项 #2 - 实现你自己的 Marshaller
您可以实现自己的同时支持 JAXB 和 Castor 的编组器。然后将其配置为:
<bean id="marshaller" class="your.domain.CustomMarshaller">
<property name="contextPath" value="com.example"/>
<property name="mappingLocation">
<value>classpath:config/service/mapping.xml</value>
</property>
</bean>
<bean
class="org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter">
<property name="marshaller" ref="marshaller" />
<property name="unmarshaller" ref="marshaller" />
</bean>
项目 #2 - 确定何时使用 JAXB 或 Castor
这可能是更难解决的问题。一旦您的端点知道 JAXB 和 Castor,您仍然需要选择一个来执行编组操作。使用上述自定义编组器方法可能更容易解决这个问题。
了解更多信息
以下是使用 Spring 配置 JAXB 的说明:
以下包含配置 Castor(和 JAXB)的说明: