【问题标题】:How to accept unformed request xml message in wso2 ESB如何在 wso2 ESB 中接受未形成的请求 xml 消息
【发布时间】:2015-03-24 05:27:08
【问题描述】:

我正在使用 wso2esb 4.8.1, 所以我的客户正在发送如下所示的未形成的 xml。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:open="http://www.openuri.org/">
   <soapenv:Header>
      <r:valid xmlns:r="http://webmail.w3school.com/use">
         <r:user xsi:type="xsd:string">admin</r:user>
         <r:password xsi:type="xsd:string">admin</r:password>
      </r:valid>
   </soapenv:Header>
   <soapenv:Body>
  <s:Payload xmlns:s="http://www.w3school.com">
  <s:request>
  <s:name>henry</s:name>
  <s:value>2345</s:value>
  </s:request>
  </s:Payload>
   </soapenv:Body>
</soapenv:Envelope>

在上面的请求中 xsi 前缀命名空间没有被声明所以它在 wso2esb 服务器中给出如下错误。

 TID: [0] [ESB] [2015-01-25 20:42:50,774] ERROR {org.apache.synapse.transport.nhttp.ServerWorker} -  Error processing POST request  {org.apache.synapse.transport.nhttp.ServerWorker}
org.apache.axis2.AxisFault: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[4,41]
Message: http://www.w3.org/TR/1999/REC-xml-names-19990114#AttributePrefixUnbound?r:user&xsi:type&xsi
        at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:180)
        at org.apache.synapse.transport.nhttp.ServerWorker.processEntityEnclosingMethod(ServerWorker.java:459)
        at org.apache.synapse.transport.nhttp.ServerWorker.run(ServerWorker.java:279)
        at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
        t java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)
Caused by: org.apache.axiom.om.OMException: javax.xml.stream.XMLStreamException:ParseError at [row,col]:[4,41]
Message: http://www.w3.org/TR/1999/REC-xml-names-19990114#AttributePrefixUnbound?r:user&xsi:type&xsi
        at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296)
        at org.apache.axiom.om.impl.llom.OMElementImpl.getNextOMSibling(OMElementImpl.java:336)

它是一个属性,所以他们没有为此声明任何命名空间。 在 java.lang.Thread.run(Thread.java:744) 引起:org.apache.axiom.om.OMException: javax.xml.stream.XMLStreamException:ParseError at [row,col]:[4,41] 留言:http://www.w3.org/TR/1999/REC-xml-names-19990114#AttributePrefixUnbound?r:user&xsi:type&xsi

如何在 wso2esb 中禁用 xml 验证,或者我将如何处理此类消息,如果我声明命名空间工作正常,但我的旧系统没有在其他 ESB 相同请求工作正常的地方发送此消息。

我已尝试使用 Http、NHttp 传输更改axis2文件中的不同消息构建器。

提前致谢。

【问题讨论】:

    标签: wso2 wso2esb wso2carbon synapse messageformat


    【解决方案1】:

    您可以使用自定义axis2消息构建器实现此目的

    1. 编写一个自定义消息构建器,它实现 org.apache.axis2.builder.Builder
    2. 自定义消息构建器应实现以下方法

      public OMElement processDocument(InputStream inputStream, String contentType, MessageContext messageContext) 抛出 AxisFault

    3. 在此方法中实现您的自定义逻辑,根据您的情况,您可以 安全地替换 xsi:type (希望你的肥皂请求不是 rpc 请求的编码样式,否则您必须声明一个 xml 命名空间)

    4. 为您的自定义消息生成器创建一个 jar 文件并将其放入 %wso2esb-home%\repository\components\lib

    5. 修改axis2.xml中的配置文件 %wso2esb-home%\repository\conf\axis2 接受您的自定义构建器 通过 wso2 突触引擎

      <messageBuilder contentType="text/xml" class="builder.CustomSoapBuilder" />
      
    6. 最后重新启动 wso2 esb 服务器以反映您的更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      相关资源
      最近更新 更多