客户端传过来的SOAP消息 用代码解析出错 
接收SOAP消息的方法public SOAPMessage onMessage(SOAPMessage msg) { System.out.println("开始接受soap消息");

try {
msg.writeTo(new FileOutputStream(new File("E:\\soapMessage.xml")));
SOAPMessage smsg = msg ;
msg.saveChanges();
System.out.println("test1");
SOAPMessage soapMessage = pm.parseMsg(smsg);
System.out.println("test2");
//soapMessage.saveChanges();

System.out.println("test3");
return null;
} catch (Exception e) {
System.out.println("接受消息报错异常###" + e);
e.printStackTrace();
return null;
}解析SOAP消息的方法
public SOAPMessage parseMsg(SOAPMessage msg){
try {
SOAPEnvelope envelope = msg.getSOAPPart().getEnvelope();
SOAPBody body = envelope.getBody();
            SOAPElement orderResponse = (SOAPElement) body.getChildElements(
                    envelope.createName("orderResponse", "uvs",
                            "http://bme.huawei.com/uvsinterface")).next();
            SOAPElement OrderResult = (SOAPElement) orderResponse
                    .getChildElements().next();
            SOAPElement ResultMessage = (SOAPElement) OrderResult
                    .getChildElements().next();
            SOAPElement MessageHeader = (SOAPElement) ResultMessage
                    .getChildElements().next();            NodeList nodelist = (NodeList) MessageHeader.getChildNodes();
            while (nodelist.getLength() > 0)
            {
                for (int i = 0; i < nodelist.getLength(); i++)
                {
                    Node node = (Node) nodelist.item(i);
                    short Type = node.getNodeType();
                    String name = node.getNodeName();
                    String value = node.getTextContent();
                    String namespace = node.getNamespaceURI();                    System.out.println(Type);
                    System.out.println(name);
                    System.out.println(value);
                    System.out.println(namespace);
                }
            }
} catch (SOAPException e) {
e.printStackTrace();
}
return null;
}控制台打印的错误信息
开始接受soap消息
test1
错误:“Invalid byte 1 of 1-byte UTF-8 sequence.”
2012-5-13 13:51:41 com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory createEnvelope
严重: SAAJ0511: Unable to create envelope from given source
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Unable to create envelope from given source: 
at com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory.createEnvelope(EnvelopeFactory.java:114)
at com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPPart1_1Impl.createEnvelopeFromSource(SOAPPart1_1Impl.java:71)
at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getEnvelope(SOAPPartImpl.java:125)
at com.mapg.methods.ParseMessage.parseMsg(ParseMessage.java:15)
at org.tuge.mapg.cn.ResposeServelt.onMessage(ResposeServelt.java:43)
at javax.xml.messaging.JAXMServlet.doPost(Unknown Source)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Caused by: javax.xml.transform.TransformerException: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:720)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)
at com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer.transform(EfficientStreamingTransformer.java:392)
at com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory.createEnvelope(EnvelopeFactory.java:102)
... 20 more麻烦大家看看这是什么原因 感激不尽

解决方案 »

  1.   

    把xml的encoding属性值UTF-8改为UTF8
      

  2.   

    我接收过来的SOAPMessage是没有
    <?xml version="1.0" encoding="UTF-8"?>
      

  3.   

    之前遇到过类似问题,是因为在xml文件被修改后,在文件开始被编辑器自动加了个特殊字符。
    LZ可以看看你的那个文件有没有加。
    网上有很多解决方案的。可以百度下
    http://blog.csdn.net/chenyanbo/article/details/6866941
      

  4.   

    是在从客户端发来的SOAPMessage中getEnvelope时出了错提示错误原因是:Invalid byte 1 of 1-byte UTF-8 sequence.它解析到了在 1字节UTF-8序列中无效的第一字节1字节UTF-8序列是怎么样的呢?
    One-byte codes are used only for the ASCII values 0 through 127. In this case the UTF-8 code has the same value as the ASCII code. The high-order bit of these codes is always 0.形式是0xxxxxxx也就是说它读到的字节最高位是1,因此被认定为是非法。
    前提是它认定该字节是UTF-8编码,为什么会认定是UTF-8,可能是默认,也可能是哪里指定,比如xml文件中。
    至于凭什么它能认定是1-byte UTF-8 sequence,不是很清楚,可能存在什么预认定机制,或者这个byte对于任意字节的UTF-8的首字节来说都是非法的,它只是表达成这样(但造成歧义了)结论:xml的编码实际上不是utf-8,可能是gb2312/gbk等,如果以这些编码去读取,也许就不会有这问题,或者传过来时将xml编码固定在utf-8
      

  5.   

    补充修改一下:
    要认定是1-byte UTF-8 sequence还是比较容易认的,只要该字节后就出现了UTF-8 sequence的任意字节首字节,就可以辨识这是一个n-byte UTF-8 sequence.first byte pattern of 1-byte UTF-8 sequence: 0xxxxxxx
    first byte pattern of 2-byte UTF-8 sequence: 110xxxxx
    first byte pattern of 3-byte UTF-8 sequence: 1110xxxx
    first byte pattern of 4-byte UTF-8 sequence: 11110xxx
    对于以下这些异常提示也是同理:
    Invalid byte 2 of 2-byte UTF-8 sequence.
    Invalid byte 2 of 3-byte UTF-8 sequence.
    Invalid byte 2 of 4-byte UTF-8 sequence.
      

  6.   

    我看你代码中,得到消息后会立即保存到soapMessage.xml文件中,这个文件的内容用工具检查下是否正确?