1

嘿 StackOverflow 用户,

我目前正在从事 SOA 项目。作为应用服务器,我使用部署了 JBoss ESB 4.11 的 JBoss 5.1。

我尝试实现一个 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>

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

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

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

我很感激任何帮助!

问候

4

1 回答 1

1

我终于解决了问题!我很难理解如何转换JavaXML的机制,SmooksAction并且我确定我仍然不了解所有内容。

无论如何,我所做的是:
1. 仔细查看文件中的SAX过滤器 2. 发现过滤器将创建一个文档,其中 Java 对象的包名称作为根元素,其所有属性作为子元素。 3. 过滤器创建的 XML 文档可用于创建虚拟对象(在本例中为 a ) 4.然后可用作 FreeMarker 模板的输入smooks-config.xml
SAXXML
SAXHashMap
HashMap

所以我的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在这种情况下),第三:使用自由标记进行模板

于 2013-03-07T12:54:32.017 回答