我有一个与解析SOAP消息有关的问题。
这是消息:
------=_Part_3_5438437.1107262647279
Content-Type: text/xml
<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Body>
<content>
[...]
</content>
</soap-env:Body>
</soap-env:Envelope>
------=_Part_3_5438437.1107262647279
Content-Type: text/plain; charset=ISO-8859-1
text
------=_Part_3_5438437.1107262647279--
这是我的Java servlet的摘录,它应该接收并解析消息:
messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
message = messageFactory.createMessage(mimeHeaders, req.getInputStream());
为了测试servlet,我使用了JMeter。我将SOAP消息放在HTTP请求的原始消息正文中。
在标题中,我这样:
内容类型multipart / related; boundary = ---- = _ Part_3_5438437.1107262647279
问题编号1:SAAJ中的解析似乎有问题,因为调试时我看到边界被视为---- null,好像=可以用作标记,仅此而已。所以我从正文和标题中都删除了它。这是一个很大的问题,因为我无法更改收到的输入,但请假装我可以稍作更改。
好的,这使我进入问题2:现在边界已正确解析,但是我得到了以下异常:com.sun.xml.messaging.saaj.SOAPExceptionImpl:SOAP的内容类型错误:文本/纯文本
好的,我相信我知道如何解决它,我必须在Content-type标头中添加类型:
内容类型multipart / related; type = text / xml; boundary = ----_ Part_3_5438437.1107262647279
是的,但是我当然还有另一个讨厌的例外:com.sun.xml.messaging.saaj.SOAPExceptionImpl:无法内部化消息
在com.sun.xml.messaging.saaj.soap.MessageImpl.parseContentType(MessageImpl.java:337)
我正在使用saaj-impl-1.3.18和saaj-api-1.3.3。
Java版本“ 1.6.0_29”
Java(TM)SE运行时环境(内部版本1.6.0_29-b11-402-11D50b)
Java HotSpot(TM)64位服务器VM(内部版本20.4-b02-402,混合模式)
最佳答案
问题2的解决方案在此处为空行:
------=_Part_3_5438437.1107262647279
Content-Type: text/xml
它必须消失,否则默认情况下将内容类型假定为文本/纯文本。
感谢Brian Joh http://twitter.com/brianwjoh指出这一点。
对于问题编号1,我只需将边界值放在“之间即可解决。同样适用于类型。
type="text/xml";boundary="----=_Part_3_5438437.1107262647279"