Java в XML (SOAP) с помощью Smooks с использованием FreeMarker

Привет, пользователи StackOverflow,

В настоящее время я работаю над проектом SOA. В качестве сервера приложений я использую JBoss 5.1 с развернутым JBoss ESB 4.11.

Я пытаюсь реализовать веб-службу, которая получает сообщения SOAP от клиентов и также отправляет ответы в виде сообщений SOAP.
При запросе сообщения SOAP получен этой веб-службой. Я использую Smooks для преобразования этого сообщения в объекты Java, чтобы я мог обработать запрос.
Когда я закончу обработку, я хочу преобразовать объекты Java в XML (ответ SOAP), снова с помощью Smooks .

Я застрял на преобразовании Java в XML.
Моя цепочка действий в файле jboss-esb.xml выглядит так:

<services>
  <service name="myWS" description="A Service" category="WS">
        <listeners>
            <jms-listener name="myListener" busidref="myChannel"/>
        </listeners>
        <actions mep="RequestResponse" inXsd="in.xsd" outXsd="out.xsd">
            <!-- Transform incomming SOAP Message into JavaBean objects -->
            <action name="xml2java-transform" class="org.jboss.soa.esb.smooks.SmooksAction">
                <property name="smooksConfig" value="/smooks/smooks-config-soap2java.xml"/>
                <property name="resultType" value="JAVA" />
            </action>

            <action name="processRequest" class="example.soa.ProcessRequest" process="process">
                <property name="config" value="val"/>
            </action>

            <!-- Transform outgoing JavaBean objects into SOAP Message -->
            <action name="java2xml-transform" class="org.jboss.soa.esb.smooks.SmooksAction">
                <property name="smooksConfig" value="/smooks/smooks-config-java2soap.xml"/>
                <property name="reportPath" value="/smooks/report.html"/>
                <property name="resultType" value="STRING" />
            </action>
        </actions>
    </service>
</services>

Мой smooksConfig второго SmooksAction выглядит так:

<smooks-resource-list   xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
                    xmlns:ftl="http://www.milyn.org/xsd/smooks/freemarker-1.1.xsd"
                    xmlns:core="http://www.milyn.org/xsd/smooks/smooks-core-1.4.xsd">

<core:filterSettings type="SAX" defaultSerialization="false"/> 

<resource-config selector="example.JavaObjectMessage">
    <resource>org.milyn.delivery.DomModelCreator</resource>
</resource-config>


<ftl:freemarker applyOnElement="example.JavaObjectMessage">
    <!--<ftl:template>/freemarker/acknowledge.flt</ftl:template> -->
    <ftl:template>
        <!-- 
        <sg:Message xmlns:sg="urn:http://example">
            <sg:MessageType>${.vars[example.JavaObjectMessage].messageType}</sg:MessageType>
        </sg:Message >
        -->
    </ftl:template>
</ftl:freemarker>
</smooks-resource-list>

После того, как действие processRequest завершит обработку входящего запроса, оно прикрепит класс example.JavaObjectMessage к сообщению esb. Таким образом, второй SmooksAction будет иметь доступ к этому объекту.

Мой вопрос: как я могу получить доступ к атрибутам «example.JavaObjectMessage» в smooksConfig? И к чему относится applyOnElement в разделе flt:tamplate?

Я уже прочитал руководство пользователя Smooks и задал этот вопрос в сообществе JBoss.

Буду признателен за любую помощь!

С уважением


person Max Werner    schedule 06.03.2013    source источник


Ответы (1)


Наконец-то я решил проблему! Мне было трудно понять механизм преобразования Java в XML с помощью SmooksAction, и я уверен, что до сих пор не все понимаю.

В любом случае, я сделал следующее:
1. присмотрелся поближе. просмотрите фильтр SAX в файле smooks-config.xml
2. Выяснили, что фильтр SAX создаст документ XML с именем пакета объекта Java в качестве корневого элемента и всеми его атрибутами в качестве дочерних элементов.
3. затем XML-документ, созданный фильтром SAX, можно использовать для создания виртуального объекта (в данном случае HashMap)
4. Затем HashMap можно использовать в качестве входных данных для шаблона FreeMarker

Итак, мой файл smooks-config.xml теперь выглядит так:

<?xml version="1.0" encoding='UTF-8'?>
<smooks-resource-list   xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
                    xmlns:ftl="http://www.milyn.org/xsd/smooks/freemarker-1.1.xsd"
                    xmlns:jb="http://www.milyn.org/xsd/smooks/javabean-1.2.xsd"
                    xmlns:core="http://www.milyn.org/xsd/smooks/smooks-core-1.4.xsd">

<resource-config selector="global-parameters">
    <param name="stream.filter.type">SAX</param>
</resource-config>

<jb:bean beanId="message" class="java.util.HashMap" createOnElement="example.JavaObjectMessage">
    <jb:value property="messageType" decoder="String" data="example.JavaObjectMessage/messageType"/>
</jb:bean>

<ftl:freemarker applyOnElement="example.JavaObjectMessage">
    <ftl:template>
    <!--     
        <sg:Message xmlns:sg="urn:http://message">
            <sg:MessageType>${message.messageType}</sg:MessageType>
        </sg:Message>
    --> 
    </ftl:template>
</ftl:freemarker>
</smooks-resource-list>

как объяснялось ранее: сначала используйте фильтр SAX, затем создайте виртуальный объект (в данном случае HashMap), в-третьих: сделайте шаблон со свободным маркером

person Max Werner    schedule 07.03.2013