【问题标题】:WSO2 ESB payload factory XML ExceptionWSO2 ESB 有效负载工厂 XML 异常
【发布时间】:2017-03-22 00:39:05
【问题描述】:

最近在我的 ESB 上调用 API 资源的任何尝试都会在 payloadFactory 运行时导致 XML 异常(下面的堆栈跟踪)。完全删除 payloadFactory 似乎是解决此问题的唯一方法。我可以没有 args、空格式或完全静态的 args 和格式,它们应该可以工作,并且昨天确实有效!

构建在 ESB 5.0.0 上,此类资源的示例如下所示:

<resource methods="POST" uri-template="/someUrl">
    <inSequence>
        <property name="acceptedRoles" value="RMD" scope="default" type="STRING/>
        <property name="myProp" value="json-eval($)" scope="default" type="STRING"/>
        <Package.ConnectorOne/>
        <Package.ConnectorTwo/>
        <loopback/>
    </inSequence>
    <outSequence>
        <payloadFactory media-type="json">
            <format>{"statusCode":$1,"errorMessage":"$2","errors":$3}</format>
            <args>
                <arg evaluator="xml" expression="get-property('statusCode')/>
                <arg evaluator="xml" expression="get-property('errorMessage')/>
                <arg evaluator="xml" expression="get-property('errors')/>
            </args>
        <payloadFactory>
        <send/>
    </outSequence>
    <faultSequence/>
</resource>

异常堆栈跟踪:

TID[-1234] [ESB] [2017-03-21 19:22:33,024] ERROR
{API_LOGGER.FleetManagement} - javax.xml.stream.XMLStreamException:
Unexpected symbol: START_OBJECT
org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296)
org.apache.axiom.om.impl.llom.OMElementImpl.buildNext(OMElementImpl.java:653
)
org.apache.axiom.om.impl.llom.OMSourcedElementImpl.buildNext(OMSourcedElemen
tImpl.java:880)
org.apache.axiom.om.impl.llom.OMNodeImpl.getNextOMSibling(OMNodeImpl.java:12
2)
org.apache.axiom.om.impl.llom.OMElementImpl.getNextOMSibling(OMElementImpl.j
ava:343)
org.apache.axiom.om.impl.traverse.OMChildrenIterator.getNextNode(OMChildrenI
terator.java:36)
org.apache.axiom.om.impl.traverse.OMAbstractIterator.hasNext(OMAbstractItera
tor.java:58)
org.apache.synapse.commons.json.JsonUtil.removeIndentations(JsonUtil.java:41
8)
org.apache.synapse.commons.json.JsonUtil.removeIndentations(JsonUtil.java:42
5)
org.apache.synapse.commons.json.JsonUtil.getNewJsonPayload(JsonUtil.java:587
)
org.apache.synapse.commons.json.JsonUtil.getNewJsonPayload(JsonUtil.java:654
)
org.apache.synapse.mediators.transform.PayloadFactoryMediator.mediate(Payloa
dFactoryMediator.java:173)
org.apache.synapse.mediators.transform.PayloadFactoryMediator.mediate(Payloa
dFactoryMediator.java:104)
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediat
or.java:97)
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediat
or.java:59)
org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.
java:158) org.apache.synapse.rest.Resource.process(Resource.java:343)
org.apache.synapse.rest.API.process(API.java:338)
org.apache.synapse.rest.RESTRequestHandler.apiProcess(RESTRequestHandler.jav
a:123)
org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.
java:101)
org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:5
6)
org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2Syn
apseEnvironment.java:304)
org.apache.synapse.mediators.builtin.LoopBackMediator.mediate(LoopBackMediat
or.java:63)
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediat
or.java:97)
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediat
or.java:59)
org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.
java:158) org.apache.synapse.rest.Resource.process(Resource.java:343)
org.apache.synapse.rest.API.process(API.java:399)
org.apache.synapse.rest.RESTRequestHandler.apiProcess(RESTRequestHandler.jav
a:123)
org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.
java:101)
org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:6
9)
org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2Syn
apseEnvironment.java:304)
org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageR
eceiver.java:75)
org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosing
RESTHandler(ServerWorker.java:325)
org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingReq
uest(ServerWorker.java:371)
org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:151
)
org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerP
ool.java:172) java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown
Source) java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

javax.xml.stream.XMLStreamException: Unexpected symbol: START_OBJECT
org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296)
org.apache.axiom.om.impl.llom.OMElementImpl.buildNext(OMElementImpl.java:653
)
org.apache.axiom.om.impl.llom.OMSourcedElementImpl.buildNext(OMSourcedElemen
tImpl.java:880)
org.apache.axiom.om.impl.llom.OMNodeImpl.getNextOMSibling(OMNodeImpl.java:12
2)
org.apache.axiom.om.impl.llom.OMElementImpl.getNextOMSibling(OMElementImpl.j
ava:343)
org.apache.axiom.om.impl.traverse.OMChildrenIterator.getNextNode(OMChildrenI
terator.java:36)
org.apache.axiom.om.impl.traverse.OMAbstractIterator.hasNext(OMAbstractItera
tor.java:58)
org.apache.synapse.commons.json.JsonUtil.removeIndentations(JsonUtil.java:41
8)
org.apache.synapse.commons.json.JsonUtil.removeIndentations(JsonUtil.java:42
5)
org.apache.synapse.commons.json.JsonUtil.getNewJsonPayload(JsonUtil.java:587
)
org.apache.synapse.commons.json.JsonUtil.getNewJsonPayload(JsonUtil.java:654
)
org.apache.synapse.mediators.transform.PayloadFactoryMediator.mediate(Payloa
dFactoryMediator.java:173)
org.apache.synapse.mediators.transform.PayloadFactoryMediator.mediate(Payloa
dFactoryMediator.java:104)
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediat
or.java:97)
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediat
or.java:59)
org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.
java:158) org.apache.synapse.rest.Resource.process(Resource.java:343)
org.apache.synapse.rest.API.process(API.java:338)
org.apache.synapse.rest.RESTRequestHandler.apiProcess(RESTRequestHandler.jav
a:123)
org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.
java:101)
org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:5
6)
org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2Syn
apseEnvironment.java:304)
org.apache.synapse.mediators.builtin.LoopBackMediator.mediate(LoopBackMediat
or.java:63)
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediat
or.java:97)
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediat
or.java:59)
org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.
java:158) org.apache.synapse.rest.Resource.process(Resource.java:343)
org.apache.synapse.rest.API.process(API.java:399)
org.apache.synapse.rest.RESTRequestHandler.apiProcess(RESTRequestHandler.jav
a:123)
org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.
java:101)
org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:6
9)
org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2Syn
apseEnvironment.java:304)
org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageR
eceiver.java:75)
org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosing
RESTHandler(ServerWorker.java:325)
org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingReq
uest(ServerWorker.java:371)
org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:151
)
org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerP
ool.java:172) java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown
Source) java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

【问题讨论】:

    标签: wso2 wso2esb


    【解决方案1】:

    我猜问题是在将参数传递给 json 时,payload factory mediator 中的表达式类型。

    *<payloadFactory media-type="json">
                <format>{"statusCode":$1,"errorMessage":"$2","errors":$3}</format>
                <args>
                    <***arg evaluator="xml"*** expression="get-property('statusCode')/>
                    <arg evaluator="xml" expression="get-property('errorMessage')/>
                    <arg evaluator="xml" expression="get-property('errors')/>
                </args>
            <payloadFactory>*
    

    arg evaluator="xml" expression="get-property('statusCode') 的值从 xml 更改为 arg evaluator= "json" expression="get-property('statusCode')json 试试看。我相信异常是由于将 xml 解析为 json。

    如果错误未解决,请发表评论。 谢谢

    【讨论】:

    • 直到明天或周一我才会再次使用我的工作电脑,但我已经尝试过不使用 arg 字段,结果是一样的。如果可以,我会尝试一下。奇怪的是,我有一个同事在他的服务器上尝试了这段代码,他说它运行良好。
    • 是的,这最终没有解决问题。尽管如此,还是感谢您的想法。
    【解决方案2】:

    也许您尝试注入 json 有效负载的参数不是 intboolean ,这会导致解析异常。

    试试这个:

     <payloadFactory media-type="json">
                <format>{"statusCode":"$1","errorMessage":"$2","errors": "$3"}</format>
                <args>
                    <arg evaluator="xml" expression="get-property('statusCode')/>
                    <arg evaluator="xml" expression="get-property('errorMessage')/>
                    <arg evaluator="xml" expression="get-property('errors')/>
                </args>
    <payloadFactory>
    

    要查看调解期间发生的详细情况,请尝试设置突触记录器 (org.apache.synapse) 并将日志连接到 DEBUG。

    【讨论】:

    • 我尝试按照您的建议提高调试级别。我没有看到任何有用的东西,但你可能会看到我没有看到的东西。开始我猜是 JsonReadOnlyStream 上的 outSequence - 的开头 -#mediate 将我的有效负载显示为 {"asdf":"fdsa"}。为简单起见,我创建了一个常量负载工厂 - 再次在 JsonReadOnlyStream 上 -JsonReaderDelegate 将 JsonXmlStreamReader 设置为 XMLStreamReader -#getLocalName 有几个“旧”和“新”条目被赋予值 -故障序列开始
    • 我检查了它与我昨晚安装在家用 PC 上的新解压 ESB 的副本,发现了一些表面上的变化(标签属性已切换顺序,添加了换行符),但没有什么应该改变服务器如何解释它们。他们甚至都在第 712 行出现了相同的“安全性”拼写错误。为了确保我没有遗漏任何内容,我插入了较新的文档并以相同的结果运行它。
    • 您能否在错误发生之前为少数调解员粘贴更新后的代理,其中包含日志?我也不确定您的连接器在做什么?
    • 我删除了所有连接器以隔离问题,并创建了一个只有一个资源的 API,其中仅包含 inSeq、outSeq 和 faultSeq。内部唯一的中介是 inSeq 和 payloadFactory 中的环回,并在 out 中发送。我的开发环境目前因维护而停机,但今晚我会将完整的日志放入 pastebin。
    • 所以我有一段时间没有发布回复的原因是,当我在周五登录以获取发生情况的日志时,服务器工作正常。不知道为什么。我没有改变任何东西,据我所知,环境没有任何改变。
    猜你喜欢
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    相关资源
    最近更新 更多