0

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

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

更新:所以似乎不是网络服务通信变得混乱,而是我编写的拦截器转储肥皂信封让我能够仔细检查。拦截器如下:

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 回答