首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用FreeMarker通过Smooks实现Java to XML (SOAP)

使用FreeMarker通过Smooks实现Java to XML (SOAP)
EN

Stack Overflow用户
提问于 2013-03-06 22:26:24
回答 1查看 4.3K关注 0票数 1

嘿,StackOverflow用户,

我目前正在做一个SOA项目。作为应用服务器,我使用部署了JBoss ESB4.11的JBoss 5.1。

我尝试实现一个Web服务,它接收来自客户端的SOAP消息,并以SOAP消息的形式发送响应。

当此Web服务收到SOAP消息请求时,我将使用Smooks将此消息转换为Java对象,以便处理请求。

完成处理后,我希望再次使用Smooks将Java对象转换为XML ( SOAP回复)。

我一直纠结于从Java到XML的转换。

我在jboss-esb.xml文件中的Action链如下所示:

代码语言:javascript
复制
<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>

我的第二个SmooksAction的smooksConfig如下所示:

代码语言:javascript
复制
<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>

在esb完成对传入请求的处理之后,它会将example.JavaObjectMessage类附加到processRequest消息。所以第二个SmooksAction将可以访问这个对象。

我的问题是:如何在smooksConfig中访问'example.JavaObjectMessage‘的属性?flt:tamplate部分中的applyOnElement指的是什么?

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

感谢大家的帮助!

问候

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-07 20:54:32

我终于解决了这个问题!我花了一段时间来理解如何使用SmooksActionJava转换为XML的机制,我确信我仍然不能理解所有的东西。

无论如何,我所做的是:

  1. 仔细研究了SAX文件中的smooks-config.xml筛选器
  2. 发现,SAX筛选器将以XML对象的包名作为根元素创建一个SAX文档,并且它的所有属性都是由
  3. 筛选器创建的子JavaXML文档,然后可以用来创建虚拟对象(在这种情况下,可以使用HashMap)
  4. the <代码>D17作为FreeMarker模板<代码>H218<代码>G219的输入

所以我的smooks-config.xml文件现在看起来像这样:

代码语言:javascript
复制
<?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),第三步:使用空闲标记进行模板

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15249879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档