You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:45:35