2

WSO2ESB4.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

これは古い質問ですが、今同じことに遭遇したので、解決策を投稿します。

SOAP エンベロープを含まないプレーンな 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"/>
于 2014-01-28T11:45:09.063 に答える
-1

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>
于 2012-10-23T02:42:11.940 に答える