WSO2 XML声明(WSO2 XML Declaration)

2019-07-01 20:15发布

我使用WSO2 ESB 4.0.3部署一个简单的服务。 我有一个服务返回的XML如下:

<Employees>
    <Employee>
        <EmployeeID>JOHNDOE1</EmployeeID>
        <FirstName>JOHN</FirstName>
        <LastName>DOE</LastName>
    </Employee>
    <Status>1</Status>
</Employees>

我遇到的问题是,有没有XML声明。 是否有返回的响应与XML声明,或者我需要使用ESB响应增加了设置? 我希望这样的事情:

<?xml version="1.0" encoding="utf-8"?>
<Employees>
    <Employee>
        <EmployeeID>JOHNDOE1</EmployeeID>
        <FirstName>JOHN</FirstName>
        <LastName>DOE</LastName>
    </Employee>
    <Status>1</Status>
</Employees>

任何帮助表示赞赏。

Answer 1:

这是一个老问题,但看到我遇到了同样的事情,刚才我会后我的解决方案。

我需要有一个代理服务返回纯XML消息而不封闭SOAP信封。 我尝试使用application/xmltext/xmlorg.apache.axis2.transport.http.ApplicationXMLFormatterorg.wso2.carbon.relay.ExpandingMessageFormatter分别)内容类型无济于事。 无论这些内容类型的XML声明返回的消息。

解决的办法是写一个自定义消息格式化。 下面是我实现的行为类似org.apache.axis2.transport.http.ApplicationXMLFormatter但正确的XML声明写入消息。

package com.example.axis2.messageformatter;

import java.io.IOException;
import java.io.OutputStream;

import org.apache.axiom.om.OMOutputFormat;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.http.ApplicationXMLFormatter;

public class CustomApplicationXmlFormatter extends ApplicationXMLFormatter {

  @Override
  public void writeTo(MessageContext context, OMOutputFormat format, OutputStream out, boolean preserve) throws AxisFault {
    String xmlHeader = "<?xml version=\"1.0\" encoding=\"" + format.getCharSetEncoding() + "\"?>";
    try {
      out.write(xmlHeader.getBytes());
    } catch (IOException e) {
      throw new AxisFault("Unable to write XML declaration to output stream.", e);
    }
    super.writeTo(context, format, out, preserve);
  }
}

你可以滴在一个jar文件的类<ESB_ROOT>/repository/components/lib 。 另外,你需要参考从Axis2的配置(对类<ESB_ROOT>/repository/conf/axis2/axis2.xml通过添加以下到消息格式化的文件的部分):

<messageFormatter contentType="application/xml" class="com.example.axis2.messageformatter.CustomApplicationXmlFormatter"/>


Answer 2:

作为Kallja面前回答 - messageFormatter应该是固定的。

我实现了自己的定位点作为一个基于Maven的项目-可在这里: https://github.com/akakunin/custom-appxml-message-formatter

我和WSO2 EI 6.0.0测试它 - 它工作正常,我。



Answer 3:

你如何捕获的SOAP消息? 您可以使用TCPMON或者只是添加日志调解与日志级别完全遵守完成完整的消息。 我想你你已经观察到的是SOAP体。 你并不需要手动添加XML声明等。

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body xmlns:m="http://www.example.org/stock">
  <m:GetStockPriceResponse>
    <m:Price>34.5</m:Price>
  </m:GetStockPriceResponse>
</soap:Body>

</soap:Envelope>


文章来源: WSO2 XML Declaration
标签: wso2 wso2esb