Java SOAP 消息内容类型

Posted

技术标签:

【中文标题】Java SOAP 消息内容类型【英文标题】:Java SOAP Message Content Type 【发布时间】:2017-11-08 01:53:04 【问题描述】:

我使用 maven wsimport 和 Java 1.7 生成了 SOAP 客户端代码。 WSDL 是客户提供的,我相信它是一个支持 .NET 的 SOAP 服务器。

调用服务后,我不断收到如下错误:

服务器发送 HTTP 状态码 415:无法处理消息 因为内容类型'application/soap+xml;字符集=utf-8;不是 预期类型'text/xml; charset=utf-8'。

我正在尝试通过自定义处理程序修改 SOAPMessage 类中的 MimeHeader(并且我确实将处理程序正确地注册到链中):

MimeHeaders mimeHeaders = msg.getMimeHeaders();
mimeHeaders.removeAllHeaders();
mimeHeaders.removeHeader("Content-Type");
mimeHeaders.addHeader(HttpHeaders.CONTENT_TYPE, "text/xml; charset=utf-8");

上面的代码似乎没有改变 mimiHeaders 中的任何内容,矢量对象似乎是不可变的......

然后我手动创建了 SOAP 消息

  MessageFactory newInstance = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
  MimeHeaders he = new MimeHeaders();
  he.addHeader("Content-Type", "text/xml; charset=utf-8");
  String ss = "<x:Envelope>xxxxx</x:Envelope>";
  InputStream in = new ByteArrayInputStream(ss.getBytes(StandardCharsets.UTF_8));

  SOAPMessage createMessage = newInstance.createMessage(he, in);
  createMessage.writeTo(System.out);  
  context.setMessage(createMessage);
  msg.saveChanges();

这次 SOAPMessage 本身的 mimeHeader 和 Content-Type 都设置为 文本/xml;字符集=utf-8

但是服务器仍然出现同样的错误 415 application/soap+xml is not expected......

我知道服务器似乎遵循 SOAP 1.1,这就是为什么它需要 text/xml...但是当我创建工厂时,我明确地将协议指定为 1.1 并手动设置 mimeHeader。我真的很困惑

注意:使用 SOAPUI 或 PostMan 绝对没问题,只有在使用 wsimport 生成的 java 客户端时才会出现问题

【问题讨论】:

【参考方案1】:

您应该首先尝试发现问题:在客户端还是在服务器上? 因此,我建议您添加以下 JVM 参数,以便转储 HTTP 请求详细信息。

-Dcom.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true

使用它,您应该会在控制台中看到如下内容:

---[HTTP request - http://localhost:8780/soap/MyService]---
Accept: text/xml
Authorization: Basic *****************==
Content-Type: text/xml; charset=utf-8
SOAPAction: "xxxxx"
User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">...

如果您确实看到 Content-Type 错误的正确值,毫无疑问:该错误位于服务提供商方面。

【讨论】:

有关适当的 JVM 属性,请参阅:***.com/questions/5350476/…

以上是关于Java SOAP 消息内容类型的主要内容,如果未能解决你的问题,请参考以下文章

无法处理消息,因为内容类型“application/soap+msbin1”不是预期的类型“text/xml”

SAAJ0537:无效的内容类型。可能是错误消息而不是 SOAP 消息

无法处理消息,因为内容类型 'text/xml;charset=UTF-8' 不是预期的类型 'application/soap+xml;字符集=utf-8'

无法处理消息,因为内容类型为 'text/xml; charset=utf-8' 不是预期的类型 'application/soap+xml;字符集=utf-8'

WCF SOAP 服务忽略内容类型字符集

为 WCF 消息设置 HTTP 内容类型