2013-03-06 3 views
1

Пользователи с Hey StackOverflow,Java to XML (SOAP) с Smooks с использованием FreeMarker

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

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

Я застрял на преобразовании из Java в XML.
My Action Chain в файле 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 Действие выполняется обработка запроса Incomming будет attatch класс example.JavaObjectMessage для сообщения esb. Таким образом, второй SmooksAction будет иметь доступ к этому объекту.

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

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

Я ценю любую помощь!

С уважением

ответ

1

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

В любом случае то, что я сделал:
1. присмотрелся на SAX фильтра в файле smooks-config.xml
2. выяснили, что SAX фильтр создаст XML документ с именем пакета объекта Java как корневой элемент и все его атрибуты в качестве дочерних элементов.
3. XML-документ, созданный фильтром SAX, затем может быть использован для создания виртуального объекта (в данном случае a 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 в этом случае), в-третьих: делать шаблоны со свободным маркером

Смежные вопросы