SOAP消息中的Mojibakes

时间:2015-06-30 09:30:24

标签: jax-ws

在我的java web服务上,我实现了WebServiceProvider并尝试获取客户端已完成的原始请求。问题是我在soap message body的xml标签中找到了像<Applicant_Place_Born>Ð&#156;оÑ&#129;ква</Applicant_Place_Born>这样不可读的字符而不是普通的西里尔字母。所以我正在寻找解决方法。可能我可以使用<Source>泛型类型而不是<SOAPMessage>,但我不知道如何将其转换为字节。
Q1:是否有可能将客户端的请求作为原始字节数组(原始二进制数据),以便我可以手动解码? Q2:是否通过为SOAP消息指定解码字符集来直接修复错误字符?

我目前的代码如下:

@WebServiceProvider(
    portName="SoaprequestImplPort",
    serviceName="services/soaprequest",
    targetNamespace="http://tempuri.org/soaprequest",
    wsdlLocation="/wsdl/SoaprequestImpl.wsdl"
)
@BindingType(value="http://schemas.xmlsoap.org/wsdl/soap/http")
@ServiceMode(value=javax.xml.ws.Service.Mode.MESSAGE)
public class SoaprequestImpl implements Provider<SOAPMessage> {

    private static final String hResponse = "<soapenv:Envelope xmlns:soapenv=\\";

    public SOAPMessage invoke(SOAPMessage req)  {
        getSOAPMessage(req);
            SOAPMessage res = null;
        try {
                res = makeSOAPMessage(hResponse);
        } catch (Exception e) {
            System.out.println("Exception: occurred " + e);
        }
        return res;
    }

    private String getSOAPMessage(SOAPMessage msg)  {
        ByteArrayOutputStream baos = null;
        try {
            baos = new ByteArrayOutputStream();
            msg.writeTo(baos);
            OutputStream outputStream = new FileOutputStream ("/opt/data/tomcat/end.txt"); 
            baos.writeTo(outputStream);     
        } catch(Exception e) {
            e.printStackTrace();
        }
        return s;
    }

    private SOAPMessage makeSOAPMessage(String msg) {
        try {
                MessageFactory factory = MessageFactory.newInstance();
                SOAPMessage message = factory.createMessage();
                message.getSOAPPart().setContent((Source)new StreamSource(new StringReader(msg)));
                message.saveChanges();
                return message;
        } catch (Exception e) {
            return null;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您所展示的只是“Москва”的UTF-8编码表示。您的SOAP数据最有可能位于顶部有 <?xml version='1.0' encoding='UTF-8' ?> 的XML文件中,该文件显示内容使用UTF-8编码。要将此类数据转换回Unicode,您需要对其进行解码。你还有一些HTML转义,所以你必须先取消它。我用Tcl测试了这个:

# The original string reported
set s "Ð&#156;оÑ&#129;ква"
# substituting the html escapes
set t "Ð\x9cоÑ\x81ква"
# decode from utf-8 into Unicode
encoding convertfrom utf-8 "Ð\x9cоÑ\x81ква"
Москва

因此,您的SOAP信息可能很好,但在允许任何尝试从utf-8解码字符串之前,您很可能需要处理HTML转义。