这是一个老问题,但是看到我刚才遇到了同样的事情,我会发布我的解决方案。
我需要有一个代理服务返回一个没有封闭肥皂信封的纯 XML 消息。我尝试使用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
. 此外,您需要<ESB_ROOT>/repository/conf/axis2/axis2.xml
通过将以下内容添加到文件的消息格式化程序部分来引用来自 axis2 配置 ( ) 的类:
<messageFormatter contentType="application/xml" class="com.example.axis2.messageformatter.CustomApplicationXmlFormatter"/>