2013-03-06 113 views
1

嘿StackOverflow用户,使用FreeMarker与Smooks的Java到XML(SOAP)

我目前正在开发一个SOA项目。作为应用程序服务器,我使用部署了JBoss ESB 4.11的JBoss 5.1。

我尝试实现一个Web服务,它接收来自客户端的SOAP消息并将响应作为SOAP消息发送。
当这个Web服务接收到SOAP消息请求时,我使用Smooks将此消息转换为Java对象,以便我可以处理该请求。
当我完成处理时,我想再次使用Smooks将Java对象转换为XML(SOAP回复)。

我一直坚持从Java到XML的转换。在jboss-esb.xml文件
我的行为链是这样的:

第二SmooksAction的
<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看起来像这样的:processRequest动作完成处理进来的请求

<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> 

后,它会attatch esc消息的example.JavaObjectMessage类。所以第二个SmooksAction将有权访问这个对象。

我的问题是:我如何访问smooksConfig中的'example.JavaObjectMessage'属性? applyOnElementflt:tamplate部分提及的是什么?

我已经阅读了Smooks用户指南,并在JBoss社区中发布了这个问题。

我很感激任何帮助!

问候

回答

1

我终于解决了这个问题!我很难理解如何将Java转换为XMLSmooksAction,并确定我仍然不明白所有的东西。

反正我所做的是:
1.在安SAX过滤smooks-config.xml文件
2.发现内仔细一看,那SAX过滤器会创建一个XML文档与Java对象的包名称根元素及其所有属性作为子元素。
3.由SAX过滤器创建的XML文档然后可用于创建虚拟对象(在这种情况下为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),第三:使用自由标记进行模板化