2012-10-22 50 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"/>