SOAP有效载荷中的特殊字符没有正确传输。

问题描述 投票:0回答:2

我用CXF写了一个SOAP网络服务,它被一个SAP系统调用,在有效载荷中,有一个词有一个特殊的字符,多次出现。然而,在一些随机的情况下,我对这个词的读法有所不同,例如,在一个有效载荷中,我看到这个词为 Kliëntbestuurder 又如 Kli��ntbestuurder.

SAP系统通过SAP PI调用我的服务只有一个字。

UPDATE:所以看来不是web服务的通信变得混乱了,而是我写的拦截器把肥皂包甩给我,让我能够仔细检查。拦截器的内容如下。

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?

java soap utf-8 cxf sap-pi
2个回答
1
投票

这可能与服务间和服务内没有一致使用编码有关。我建议你通过阅读这篇优秀的文章来帮助自己 教程--Unicode--如何正确地使用字符? 端到端。然后,一旦你缩小了错误的范围,再问后续问题。


1
投票

检查你从Web服务发回的响应的http头。您可以使用 肥皂水 来查看标题。如果你没有看到类似

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服务的客户端是否也使用了正确的编码。你可能向他发送了一个有效的响应。

© www.soinside.com 2019 - 2024. All rights reserved.