我使用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>
任何帮助表示赞赏。
这是一个老问题,但看到我遇到了同样的事情,刚才我会后我的解决方案。
我需要有一个代理服务返回纯XML消息而不封闭SOAP信封。 我尝试使用application/xml
和text/xml
( org.apache.axis2.transport.http.ApplicationXMLFormatter
和org.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"/>
作为Kallja面前回答 - messageFormatter应该是固定的。
我实现了自己的定位点作为一个基于Maven的项目-可在这里: https://github.com/akakunin/custom-appxml-message-formatter
我和WSO2 EI 6.0.0测试它 - 它工作正常,我。
你如何捕获的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>