0

SAP システムによって呼び出されている CXF を使用して SOAP Web サービスを作成しました。ペイロードには、複数回出現する特殊文字を含む単語があります。ただし、ランダムなケースでは、この単語の読み方が異なります。つまり、あるペイロードでは単語がKliëntbestuurderと表示され、別のペイロードでは と表示されKli��ntbestuurderます。

SAP PI を介して私のサービスを呼び出す SAP システムには、1 つの単語しかありません。

更新: 混乱していたのは Web サービス通信ではなく、精査できるように SOAP エンベロープをダンプするために作成したインターセプターだったようです。インターセプターは次のとおりです。

public class WebServiceMessageInterceptor extends AbstractPhaseInterceptor<Message> {

public WebServiceMessageInterceptor() {
    super(Phase.RECEIVE);
}

@Override
public void handleMessage(Message message) throws Fault {
    final LoggingMessage buffer = new LoggingMessage("", "");

    String encoding = (String) message.get(Message.ENCODING);

    if (encoding != null) {
        buffer.getEncoding().append(encoding);
    }
    Object headers = message.get(Message.PROTOCOL_HEADERS);

    if (headers != null) {
        buffer.getHeader().append(headers);
    }

    InputStream is = message.getContent(InputStream.class);
    if (is != null) {
        CachedOutputStream outputStream = new CachedOutputStream();
        try {
            IOUtils.copy(is, outputStream);
            outputStream.flush();
            is.close();

            message.setContent(InputStream.class, outputStream.getInputStream());
            outputStream.writeCacheTo(buffer.getPayload(), "UTF-8", -1);
            outputStream.close();

            FileUtils.writeStringToFile(new File("/tmp/soap" + System.currentTimeMillis() + ".log"), buffer.toString(), "UTF-8");
        } catch (IOException e) {
            e.printStackTrace();
            throw new Fault(e);
        }
    }
}

インターセプターが UTF-8 を使用していない理由について、さらにアイデアはありますか?

4

2 に答える 2

1

これは、サービス全体およびサービス内で一貫してエンコーディングを使用していないことに関連している可能性があります。この優れたチュートリアル-Unicode-文字を正しく取得する方法を読んで、自分自身を助けることをお勧めします。端から端まで。次に、エラーの範囲を絞り込んだら、フォローアップの質問をします。

于 2012-11-02T14:01:36.530 に答える
1

Web サービスから送り返す応答の http ヘッダーを確認します。ヘッダーを表示するには、 soapUIの [Raw] タブを使用できます。次のようなものが表示されない場合

Content-Type: text/xml;charset=UTF-8

次に、WebMethods で次のようなことを行うことにより、CXF に強制的にそれを応答に追加させることができます。

MessageContext ctx = context.getMessageContext();
ctx.put(Message.CONTENT_TYPE, "text/xml;charset=UTF-8");

context は、クラスに注入された javax.xml.ws.WebServiceContext です。

また、Web サービスに対するクライアントも正しいエンコーディングを使用していることを確認する必要があります。あなたは彼に有効な応答を送信している可能性があります。

于 2012-11-05T23:39:34.893 に答える