Два разных маршаллера в весеннем проекте - PullRequest
2 голосов
/ 19 января 2011

Мне нужно использовать два разных маршаллера, обычно 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

Ответы [ 2 ]

2 голосов
/ 19 января 2011

В конечном счете, есть две проблемы, которые необходимо решить:

  1. Внедрить JAXB и Castor marshaller / unmarshaller
  2. Определить, когда следует использовать JAXB или Castor

Элемент № 1 - Внедрить JAXB и маршаллер / демаршаллер Castor

org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter имеет одно свойство маршаллера и одно свойство маршаллера.Существует два способа решения этой проблемы:

Вариант № 1 - GenericMarshallingMethodEndpointAdapter подкласса

Вы можете создать подкласс rg.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter и введите второго маршаллера - свойство демаршаллера.Затем вы настроите это примерно так:

<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 - Реализация собственного маршаллера

Вы можете реализовать свой собственный маршаллер, которыйJAXB и Кастор осведомлены.Затем настройте его следующим образом:

<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>

Item # 2 - Определите, когда, когда использовать JAXB или Castor

Это может быть труднее решить.Как только вы ознакомите свою конечную точку с JAXB и Castor, вам все равно нужно будет выбрать одну из них для выполнения маршальной операции.Этот аспект может быть легче решить с помощью пользовательского подхода маршаллера, описанного выше.

Для получения дополнительной информации

Ниже приведены инструкции по настройке JAXB с помощью Spring:

Ниже приведены инструкции по настройке Castor (и JAXB):

0 голосов
/ 22 февраля 2011

Я закончил с тупиком, я опустил JAXB, я просто использую Castor.

...