Главная » Spring » Настройка маршалера сообщений Spring

0

Преобразование объектов в формат XML и обратно выполняется с помощью механизма отображения объектов в XML (Object-XML Mapping, OXM). Фреймворк Spring-OXM является составной ча- стью фреймворка Spring-WS и реализует уровень абстракции на основе нескольких популярных OXM-решений, включая JAXB и Castor XML.

Центральное положение в Spring-OXM  занимают  интерфей- сы Marshaller и Unmarshaller. Реализации интерфейса Marshaller, как ожидается, должны из Java-объектов генерировать XML-элементы.

Реализации интерфейса Unmarshaller, напротив, используются для конструирования Java-объектов из XML-элементов.

При обработке сообщений класс AbstractMarshallingPayloadEndpo int использует маршалеры и демаршалеры из Spring-OXM. Ког- да AbstractMarshallingPayloadEndpoint принимает сообщение, оно передается реализации интерфейса Unmarshaller для преобразова- ния XML-сообщения в объект, который затем передается методу invokeInternal(). Затем, когда invokeInternal() завершит работу, воз- вращаемый им объект передается реализации интерфейса Marshaller для преобразования в XML-сообщение, которое будет отправлено клиенту.

К счастью, вам не придется создавать собственные реализации интерфейсов Marshaller и Unmarshaller.  Фреймворк  Spring-OXM уже содержит несколько таких реализаций, которые перечислены в табл. 15.3.

Таблица 15.3. Маршалеры, преобразующие объекты в формат XML и обратно. Фреймворк Spring-OXM предоставляет несколько реализаций маршалеров, которые можно использовать совместно с фреймворком Spring-WS

OXM-решение

Маршалер в Spring-OXM

Castor XML

org.springframework.oxm.castor.CastorMarshaller

JAXB v1

org.springframework.oxm.jaxb.Jaxb1Marshaller

JAXB v2

org.springframework.oxm.jaxb.Jaxb2Marshaller

JiBX

org.springframework.oxm.jibx.JibxMarshaller

XMLBeans

org.springframework.oxm.xmlbeans.XmlBeansMarshaller

XStream

org.springframework.oxm.xstream.XStreamMarshaller

В табл. 15.3 перечислены только классы маршалеров. Но это не ошибка. Все классы маршалеров, перечисленные в табл. 15.3, реали- зуют оба интерфейса, Marshaller и Unmarshaller, обеспечивая универ- сальные OXM-решения маршалинга.

Выбор того или иного OXM-решения – в значительной степени дело вкуса. Каждое решение, предлагаемое фреймворком Spring- WS, имеет свои достоинства и недостатки. Однако решение XStream имеет ограниченную поддержку пространств имен XML, необходи- мых в определениях типов для веб-служб. То есть решение XStream с успехом может использоваться для сериализации объектов в фор- мат XML и обратно вообще, но его не следует применять при раз- работке веб-служб.

Для нужд службы оценки комбинации карт было выбрано реше- ние Castor XML. Таким образом, нам необходимо настроить компо- нент CastorMarshaller  в контексте Spring:

<bean id="marshaller" class="org.springframework.oxm.castor.CastorMarshaller">

<property  name="mappingLocation" value="classpath:mapping.xml"   />

</bean>

Решение Castor XML можно использовать для выполнения прос- того XML-маршалинга без дополнительных настроек. Но нам тре- буется немного больше, чем может дать решение Castor XML с на- стройками по умолчанию. Следовательно, компонент CastorMarshaller необходимо настроить на использование файла отображения. Свой- ство mappingLocation определяет местоположение файла отображе- ния в формате Castor XML. В примере выше посредством свойства mappingLocation мы указали, что поиск файла отображения с именем mapping.xml должен выполняться в корневом каталоге библиотеки классов приложения.

Содержимое файла mapping.xml приводится в листинге 15.4.

Листинг 15.4. Файл отображения в формате Castor XML

с определениями типов для службы оценки комбинации карт при игре в покер

<?xml version="1.0"?>

<!DOCTYPE  mapping  PUBLIC

"-//EXOLAB/Castor Object Mapping DTD Version 1.0//EN" "http://castor.exolab.org/mapping.dtd">

<!– Отображает <EvaluateHandRequest> в EvaluateHandRequest –>

<mapping     xmlns="http://castor.exolab.org/">

<class    name="com.springinaction.poker.webservice.EvaluateHandRequest"

<map-to  xml="EvaluateHandRequest"  />

<!–  Отображает  <hand>  в  массив  объектов  Card  –>

<field  name="hand" collection="array" type="com.springinaction.poker.Card" required="true">

<bind-xml  name="card"  node="element"  />

</field>

</class>

<!–  Отображает  <card>  в  Card  и  <suit>  в  Suit–>

<class   name="com.springinaction.poker.Card">

<map-to  xml="card"  />

<field  name="suit"  type="com.springinaction.poker.Suit" required="true">

<bind-xml name="suit" node="element" />

</field>

<!– Отображает <face> в Face –>

<field name="face" type="com.springinaction.poker.Face" required="true">

<bind-xml name="face" node="element" />

</field>

</class>

<!– Отображает <EvaluateHandResponse> в EvaluateHandResponse –>

<class   name="com.springinaction.poker.webservice.EvaluateHandResponse">

<map-to xml="EvaluateHandResponse"

ns-uri="http://www.springinaction.com/poker/schemas" ns-prefix="tns"   />

<field  name="pokerHand" type="com.springinaction.poker.PokerHandType" required="true">

<bind-xml name="tns:handName" node="element" QName-prefix="tns"

xmlns:tns="http://www.springinaction.com/poker/schemas"/>

</field>

</class>

</mapping>

Теперь у нас имеются настроенные компоненты отображения со- общений в конечные точки, реализации конечной точки и марша- линга XML. На данный момент реализация веб-службы оценки ком- бинации карт при игре в покер практически закончена. Мы могли бы развернуть приложение и закончить на этом. Но у нас осталась еще пара компонентов, которые сделают веб-службу более полной. Посмотрим, как повысить надежность веб-службы, добавив компо- нент, отображающий исключения Java в ошибки SOAP.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии