Мы часто хотим отправлять XML через веб-сервисы. Возможно, в нашем приложении уже настроены схемы или аннотированные классы JAXB2. Что если мы хотим отправить тот же формат через JMS? По умолчанию Spring JMS настроен на сериализацию отправки и получения объектов. Как мы можем перейти на использование JAXB2 (или любой другой стратегии маршалинга OXM)?
В следующем примере предполагается, что мы сначала идем от аннотаций, а не от схемы XML.
Краткая информация
- Annotate Bean с JAXB2
- Настройте конвертер OXM
- Интеграционный тест
- Визуализируйте результаты
- Конфигурация журнала
- Конфигурация Maven
1. Аннотировать бин с JAXB2
- Используйте аннотации JAXB2 для нашего компонента
2. Настройте конвертер OXM
- Определите наших маршалеров — мы видим, что <oxm: jaxb2-marshaller …> определяет JAXB2 в качестве нашего маршаллера для класса Account
- Зарегистрируйте наш MarshallingMessageConverter — мы зарегистрируем MarshallingMessageConverter, чтобы использовать маршаллер JAXB2 для входящих и исходящих данных.
- Зарегистрируйте наш конвертер — в JmsTemplate мы регистрируем наш oxmMessageConverter как messageConverter. Это заменяет SimpleMessageConverter по умолчанию, который будет опираться на сериализацию
- Обратите внимание на пространство имен ActiveMQ?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:oxm="http://www.springframework.org/schema/oxm"
xsi:schemaLocation="http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<amq:broker persistent="false" useJmx="true">
<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:61616" />
</amq:transportConnectors>
</amq:broker>
<amq:connectionFactory brokerURL="vm://localhost" id="jmsFactory" />
<!-- Spring JMS Template -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsFactory" />
<property name="defaultDestination" ref="oxmTestQueue" />
<property name="messageConverter" ref="oxmMessageConverter" />
</bean>
<amq:queue id="oxmTestQueue" physicalName="oxm.test.queue" />
<bean id="oxmMessageConverter"
class="org.springframework.jms.support.converter.MarshallingMessageConverter">
<property name="marshaller" ref="marshaller" />
<property name="unmarshaller" ref="marshaller" />
</bean>
<oxm:jaxb2-marshaller id="marshaller">
<oxm:class-to-be-bound name="com.gordondickens.jmswithoxm.Account" />
</oxm:jaxb2-marshaller>
</beans>
3. Интеграционный тест
- Заполнить компонент Account
- Вызывает convertAndSend на JmsTemplate для маршала и отправки учетной записи
- Включает обратный вызов postProcessor для регистрации данных XML
- Вызывает receiveAndConvert на JmsTemplate, чтобы получить и распаковать аккаунт
- Утверждает конечное состояние
4. Визуализация результатов
- Выполнить: mvn clean test
- См. Учетную запись XML между блоком <! — MSG START -> & <! — MSG END ->
- Вывод был отформатирован для ясности
5. Конфигурация журнала
- Logback очень похож на Log4J
- Шаблоны Logback также используют символы Log4J
- См .: Документация по макету шаблона обратного входа
6. Конфигурация Maven
- Использование Logback для поддержки Log4J, SLF4J, Apache (JCL) и Java Util Logging
- Включены компоновщики IDE для STS / Eclipse & IntelliJ IDEA
6. Получение кода
- Код в моем Git Repo:
https://github.com/gordonad/core-spring-demos/tree/master/demos/JmsOxmDemo
Дальнейшее чтение
- Ссылка Spring для JMS — Раздел 21.3.1 Использование конвертеров сообщений
- Core Spring Training — где я преподаю JMS вместе со Spring
- Интеграция предприятия с Spring Training — Где я преподаю JMS с Spring
С http://gordondickens.com/wordpress/2011/02/07/sending-beans-as-xml-with-jmstemplate/