1. ホーム
  2. java

[解決済み] JavaでSOAPMessageから生のXMLを取得する

2023-06-05 18:12:08

質問

JAX-WSでSOAP WebServiceProviderをセットアップしましたが、SOAPMessage(または任意のNode)オブジェクトから生のXMLを取得する方法がわからなくて困っています。 以下は、私が今持っているコードのサンプルで、XML を取得しようとしているところです。

@WebServiceProvider(wsdlLocation="SoapService.wsdl")
@ServiceMode(value=Service.Mode.MESSAGE)
public class SoapProvider implements Provider<SOAPMessage>
{
    public SOAPMessage invoke(SOAPMessage msg)
    {
        // How do I get the raw XML here?
    }
}

元のリクエストのXMLを取得する簡単な方法はないでしょうか? もし、別のタイプのプロバイダ(Sourceなど)を設定して生のXMLを取得する方法があれば、それもやってみたいと思っています。

どのように解決するのですか?

Provider<Source> を使って、この方法で生のXMLを取得できることが判明しています。

import java.io.ByteArrayOutputStream;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.ws.Provider;
import javax.xml.ws.Service;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceProvider;

@ServiceMode(value=Service.Mode.PAYLOAD)
@WebServiceProvider()
public class SoapProvider implements Provider<Source>
{
    public Source invoke(Source msg)
    {
        StreamResult sr = new StreamResult();

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        sr.setOutputStream(out);

        try {
            Transformer trans = TransformerFactory.newInstance().newTransformer();
            trans.transform(msg, sr);

            // Use out to your heart's desire.
        }
        catch (TransformerException e) {
            e.printStackTrace();
        }    

        return msg;
    }
}

私は結局このソリューションを必要としなかったので、このコードを自分自身で実際に試していません - 正しくするためにいくつかの調整が必要かもしれません。 しかし、これが Web サービスから生の XML を取得するために進むべき正しい道であることは分かっています。

(どうしてもSOAPMessageオブジェクトが必要な場合、これをどのように動作させるかはわかりませんが、いずれにせよ生のXMLを処理するのであれば、なぜ上位のオブジェクトを使用するのでしょうか?)