Spring JMSListener и маршалинг JAXB

у меня есть "конечная точка" JMS, например:

@JmsListener(destination = "TestQueue")
public void doSomething(MyJaxbAnnotatedClass myclass) {
}

Конечно, с необходимой конфигурацией applicationContext, такой как ‹jms:annotation-driven/› и тому подобное. Все это работало, когда сигнатура моего метода была всего лишь

public void doSomething(String xmlString)

Но я хочу, чтобы Spring автоматически выполнял демаршаллинг, как я делаю это с JSON в контексте Spring-MVC. Но почему-то Spring нуждается в дополнительной настройке, чтобы это произошло, потому что я получаю следующую трассировку стека при попытке использовать параметр MyJaxbAnnotatedClass:

 Caused by: org.springframework.messaging.converter.MessageConversionException: No converter found to convert to class de.xxx.xxx.MyJaxbAnnotatedClass, message=GenericMessage [payload=<BRNArtikelStamm:EcomxProducts 
xmlns:BRNfoo="http://www.xxx.xxx/foofoo" 

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

Спасибо за любой вклад.


person Logemann    schedule 10.12.2014    source источник


Ответы (1)


Вам нужно зарегистрировать конвертер сообщений, который может это сделать, почти так же, как вы должны сделать для любого нетривиального преобразования.

Поскольку вы, очевидно, используете JmsListerContainerFactory по умолчанию, расширьте его, чтобы зарегистрировать конвертер сообщений для вашего слушателя, например:

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory());
    factory.setMessageConverter(jmsMessageConverter());
    return factory;
}

Ваш jmsMessageConverter определяет, как десериализуются сообщения (вы можете повторно использовать один и тот же экземпляр на стороне продукта). Попробуйте MarshallingMessageConverter с Jaxb2Marshaller

person Stephane Nicoll    schedule 17.12.2014