SOAP有效负载中的特殊字符无法正确通过

时间:2012-11-02 13:53:55

标签: java soap utf-8 cxf

我已经使用CXF编写了一个SOAP Web服务,该系统由SAP系统调用,在有效负载中有一个带有特殊字符的单词会多次出现,但是在某些情况下我会以不同的方式阅读这个单词(看似随机)。即。在一个有效载荷中,我会看到这个词通过'Kliëntbestuurder'而来,并且稍微向下通过'Kli ntbestuurder'。

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的任何进一步的想法(我已经在任何地方指定了我认为我可以)

2 个答案:

答案 0 :(得分:1)

这可能与在服务之间和服务内部不一致地使用编码有关。我建议你通过端到端阅读这篇优秀的tutorial - Unicode - How to get the characters right?来帮助自己。然后在缩小错误范围后询问后续问题。

答案 1 :(得分:1)

检查您从Web服务发回的响应的http标头。您可以使用soapUI中的“原始”标签查看标题。如果你没有看到像

这样的东西
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服务的客户端是否也使用了正确的编码。您可能会向他发送有效回复。