我有一个与解析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"

10-07 16:23