2

我正在使用 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>

任何帮助表示赞赏。

4

3 回答 3

2

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

我需要有一个代理服务返回一个没有封闭肥皂信封的纯 XML 消息。我尝试使用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. 此外,您需要<ESB_ROOT>/repository/conf/axis2/axis2.xml通过将以下内容添加到文件的消息格式化程序部分来引用来自 axis2 配置 ( ) 的类:

<messageFormatter contentType="application/xml" class="com.example.axis2.messageformatter.CustomApplicationXmlFormatter"/>
于 2014-01-28T11:45:09.063 回答
1

正如 Kallja 之前回答的那样 - messageFormatter 应该是固定的。

我已经将他的修复实现为基于 maven 的项目 - 可在此处获得:https ://github.com/akakunin/custom-appxml-message-formatter

我已经用 WSO2 EI 6.0.0 对其进行了测试——它对我来说很好用。

于 2017-03-18T20:07:07.377 回答
-1

您是如何捕获 SOAP 消息的?您可以使用Tcpmon或仅添加日志级别为 full 的日志中介来观察完整的完整消息。我假设您观察到的是 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>
于 2012-10-23T02:42:11.940 回答