2012-10-22 104 views
1

我正在使用WSO2 ESB 4.0.3部署简单的服务。我有一个返回以下XML的服务:WSO2 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> 

任何帮助表示赞赏。

回答

-1

如何捕获SOAP消息?您可以使用Tcpmon或只添加日志级别已满的log mediator以观察完整的消息。我假设你所观察到的是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> 
+0

-1。答案并没有真正回答原来的问题,甚至在与此相同的场地上也没有答案。 – Kallja

2

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

我需要一个代理服务返回一个普通的XML消息没有封闭的肥皂信封。我尝试使用application/xmltext/xml(分别为org.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"/>