如何在wso2 ESB中接受未成形的请求xml消息

时间:2015-01-25 17:31:25

标签: wso2 wso2esb wso2carbon synapse messageformat

我正在使用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:[row,col]处的ParseError:[4,41]     消息:http://www.w3.org/TR/1999/REC-xml-names-19990114#AttributePrefixUnbound?r:user&xsi:type&xsi

如何在wso2esb中对xml验证进行diable或如何处理这种消息,如果我声明命名空间它工作正常,但是我的遗留系统不会发送它在其他ESB相同请求正常工作的地方。

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

提前感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用自定义axis2邮件构建器

来实现此目的
  1. 编写实现的自定义消息构建器 org.apache.axis2.builder.Builder
  2. 自定义消息构建器应实现以下方法

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

  3. 在这种方法中实现您的自定义逻辑,在您的情况下,您可以 安全地替换xsi:type(希望你的soap请求不是rpc 编码样式的请求,否则你必须声明一个xml namesapce)

  4. 为自定义消息构建器创建一个jar文件并将其放入 的%wso2esb家庭%\库\部件\ lib中

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

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