同一WSDL在不同工具及Java客户端返回结果异常求助
SOAP WebService调用异常:Content-Type不匹配问题解决
问题概述
同一个WSDL地址,不同工具调用结果不一致:
- Postman、JDeveloper HTTP分析器返回500 Internal Server Error
- SOAP UI能正常返回结果
- 自定义Java客户端调用时抛出以下异常:
Exception in thread "main" com.sun.xml.internal.ws.server.UnsupportedMediaException: Unsupported Content-Type: application/xml Supported ones are: [text/xml] at com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:220) at com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:151) at com.sun.xml.internal.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:299) at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.createResponsePacket(HttpTransportPipe.java:268) at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:217) at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:130) at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:95) at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:1121) at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:1035) at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:1004) at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:862) at com.sun.xml.internal.ws.client.Stub.process(Stub.java:448) at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:178) at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:93) at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:77) at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:147) at com.sun.proxy.$Proxy36.getService(Unknown Source) at someClient.SomeClient.main(WaselClient.java:23)
解决步骤
1. 统一请求的Content-Type头
SOAP 1.1规范要求请求的Content-Type必须是text/xml; charset=utf-8,Postman和JDeveloper可能默认使用了application/xml,导致服务端解析失败返回500错误。
- 手动修改工具的请求头,将
Content-Type设置为text/xml; charset=utf-8,重新测试即可解决500问题。
2. 修复Java客户端的Content-Type配置
异常明确说明服务端仅接受text/xml,但客户端发送了application/xml,可以通过以下方式调整:
- 方式一:通过BindingProvider动态设置
在调用服务方法前添加代码:// 假设port是你的服务端口实例 BindingProvider bp = (BindingProvider) port; bp.getRequestContext().put(BindingProvider.CONTENT_TYPE_PROPERTY, "text/xml; charset=utf-8"); - 方式二:调整生成客户端的配置
如果是JDeveloper生成的客户端,检查生成的jaxws相关配置文件,确保绑定的Content-Type为text/xml。 - 方式三:手动构建SOAP请求时设置
若自行构建SOAPMessage,添加属性配置:SOAPMessage soapMsg = ...; soapMsg.setProperty(SOAPMessage.CONTENT_TYPE, "text/xml; charset=utf-8");
3. 确认服务端SOAP版本
检查服务端使用的SOAP版本,确保客户端Content-Type与之匹配:
- SOAP 1.1对应Content-Type:
text/xml - SOAP 1.2对应Content-Type:
application/soap+xml
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

