2011-01-19 3 views
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

+1

И ваш вопрос ...? – skaffman

+1

как это сделать? –

ответ

2

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

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

Item # 1 - Вводите как JAXB и Castor маршаллер/unmarshaller

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

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

Вы могли бы подкласс rg.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter и ввести второй ИАС ап свойство 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 - реализовать свой собственный ИАС

Вы могли бы реализовать свой собственный маршаллер, который является одновременно 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 или касторовое

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

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

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

Следующая содержит инструкции по настройке Castor (и JAXB):

+0

Благодарим вас за беспокойство. Но мне нужно использовать их как в одном проекте –

+0

Вы пробовали комбинировать их в конфиге? Я обновил свой ответ, чтобы включить фрагмент того, как это может выглядеть. –

+0

Я отредактировал описание этого ответа Я внес некоторые изменения в конечной точке –

0

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