[英]How to extract elements from xml having multiple namespaces using java smooks and freemarker
[英]Java to XML (SOAP) with Smooks using FreeMarker
嘿StackOverflow用戶,
我目前正在從事SOA項目。 作為應用服務器,我將JBoss 5.1與已部署的JBoss ESB 4.11結合使用。
我嘗試實現一個Web服務,該服務從客戶端接收SOAP消息,並以SOAP消息的形式發送響應。
當此Web服務收到SOAP消息請求時,我正在使用Smooks將此消息轉換為Java對象,以便我可以處理該請求。
完成處理后,我想再次使用Smooks將Java對象轉換為XML(SOAP答復)。
我停留在從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
Action處理完傳入的請求之后,它將把example.JavaObjectMessage
類附加到esb消息。 因此,第二個SmooksAction將有權訪問此Object。
我的問題是:如何在smooksConfig
訪問“ example.JavaObjectMessage”的smooksConfig
? 在flt:tamplate
部分中, applyOnElement
指的是什么?
我已經閱讀了《 Smooks用戶指南》,並且在JBoss社區中也發布了此問題。
感謝您的幫助!
問候
我終於解決了問題! 我很難理解如何使用SmooksAction
將Java
轉換為XML
的機制,並且確定我仍然不了解所有內容。
無論如何,我所做的是:
1.仔細查看smooks-config.xml
文件中的SAX
篩選器
2.發現, SAX
篩選器將創建一個XML
文檔,其中Java Object的包名稱為根元素,其所有屬性為子元素。
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
),第三步:使用自由標記進行模板制作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.