2

我需要使用两个不同的编组器,通常是 JaxbMarshaller 和 CastorMarshaller。我有很多集成模块的春季项目。

<bean id="marshaller" class="org.springframework.oxm.castor.CastorMarshaller">
    <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>

我还将它添加到我的端点以提供 JaxbMarshaller 但它没有得到它

public class MyEndPoint extends AbstractMarshallingPayloadEndpoint

我需要同时使用 JaxbMarshaller 和 CastorMarshaller

4

2 回答 2

2

最终有两个问题需要解决:

  1. 同时注入 JAXB 和 Castor marshaller/unmarshaller
  2. 确定何时使用 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)的说明:

于 2011-01-19T15:39:56.593 回答
0

我以死胡同结束,我省略了 JAXB,我只使用 Castor。

于 2011-02-22T09:12:59.020 回答