2

我有一个与解析 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 请求的原始帖子正文中。在标题中我放了这个: Content-type multipart/related;boundary=----=_Part_3_5438437.1107262647279

问题1:似乎SAAJ中的解析有问题,因为调试我看到边界被视为----null,好像=可以用作标记,仅此而已。所以我从正文和标题中删除了它。这是一个很大的问题,因为我无法更改收到的输入,但让我们假装我可以一段时间。好的,这使我前进到问题 2:现在边界已正确解析,但我得到了这个异常:com.sun.xml.messaging.saaj.SOAPExceptionImpl: Bad Content-Type for SOAP Part : text/plain

好的,我相信我知道怎么解决了,我要在Content-type头中添加类型:Content-type multipart/related;type=text/xml;boundary=----_Part_3_5438437.1107262647279

是的,但当然我还有另一个讨厌的例外:com.sun.xml.messaging.saaj.SOAPExceptionImpl: Unable to internalize message at 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 Runtime Environment (build 1.6.0_29-b11-402-11D50b)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, 混合模式)

4

1 回答 1

2

问题 2 的解决方案位于此处的行中:

------=_Part_3_5438437.1107262647279

Content-Type: text/xml

它必须消失,否则默认情况下假定内容类型为 text/plain。感谢 Brian Joh http://twitter.com/brianwjoh指出这一点。
对于第 1 个问题,我只是通过将边界值放在“之间”来解决它。同样适用于类型。

 type="text/xml";boundary="----=_Part_3_5438437.1107262647279"
于 2012-02-15T10:50:30.783 回答