两个不同的marshallers在春天项目

时间:2011-01-19 14:53:49

标签: jaxb jax-ws marshalling spring-ws castor

我需要使用两个不同的marshallers,通常是JaxbMarshaller和CastorMarshaller。 我有一个包含大量集成模块的spring项目。

<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

2 个答案:

答案 0 :(得分:2)

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

  1. 注入JAXB和Castor marshaller / unmarshaller
  2. 确定何时使用JAXB或Castor
  3. 项目#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

    您可以实现自己的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)的说明:

答案 1 :(得分:0)

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