java - SOAP 负载中的特殊字符未正确传输

标签 java soap utf-8 cxf sap-pi

我使用 CXF 编写了一个 SOAP Web 服务,该服务由 SAP 系统调用,在有效负载中,有一个带有多次出现的特殊字符的单词。然而,在某些随机情况下,我对这个词的解读有所不同,即在一个有效负载中,我将该词视为 Kliëntbestuurder,而在另一个有效负载中,我将其视为 Kli��ntbestuurder

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

更新: 因此,似乎不是 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 的任何进一步想法吗?

最佳答案

这可能与服务之间和服务内未使用一致的编码有关。我建议您阅读这篇优秀的tutorial - Unicode - How to get the characters right?来帮助自己端到端。一旦缩小了错误的范围,就提出后续问题。

关于java - SOAP 负载中的特殊字符未正确传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13196627/

相关文章:

SOAP 的 WCF 故障

java - 为什么从 JSch 中的 shell channel 输出读取永远不会以 -1 结尾?

java - 由于 XML 属性顺序更改而导致数字签名损坏

android - 我有哪些选项可以显示 Android 无法显示的字符?

c++ - 使用 C++11\u vs\x 输出 Unicode 字符串时输出不同?

java - 多个 Spring Boot 应用程序

java RMI无法运行服务器

java - Selenium Webdriver 和 Java。元素在点 (x, y) 处不可单击。其他元素将收到点击

java - 线程安全的 java servlet

iphone - iPhone 的 SudzC 似乎在每次 Web 服务调用时泄漏 1kB