在JDeveloper中调用SOAP WSDL服务时遭遇UnsupportedMediaException错误
问题分析
错误核心是UnsupportedMediaException:服务端仅接受text/xml类型的请求,但你的Java客户端发送的请求Content-Type为application/xml,导致服务端拒绝处理。
SOAP UI能正常调用是因为它默认遵循SOAP 1.1规范,自动将请求Content-Type设为text/xml;charset=utf-8;而Postman和你的Java客户端因Content-Type不符合要求,分别返回500错误和抛出异常。
解决方案1:通过BindingProvider直接修改请求头
获取服务端口实例后,添加代码强制设置请求的Content-Type:
public static void main(String[] args) { WaselClient waselClient = new WaselClient(); WaselAddressService waselAddressService = new WaselAddressService(); IWaselAddressService iWaselAddressService = waselAddressService.getBasicHttpBindingIWaselAddressService(); // 新增:设置请求Content-Type为text/xml BindingProvider bp = (BindingProvider) iWaselAddressService; bp.getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, Collections.singletonMap("Content-Type", Collections.singletonList("text/xml;charset=utf-8"))); try { GetAddressResponseStructure address = iWaselAddressService.getIndividualWaselAddress(ItemChoiceType.ID, "999999"); System.out.println("" + address.getGetIndividualWaselAddressResponseDetailObject() .getWaselAddress() .get(1)); } catch (IWaselAddressServiceGetIndividualWaselAddressCommonErrorElementFaultMessage e) { System.out.println(e.getMessage()); } }
解决方案2:自定义SOAP拦截器修改Content-Type
如果方案1不生效,可通过拦截器全局修改请求头:
1. 实现SOAPHandler
public class ContentTypeFixHandler implements SOAPHandler<SOAPMessageContext> { @Override public Set<QName> getHeaders() { return null; } @Override public boolean handleMessage(SOAPMessageContext context) { Boolean isOutbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (isOutbound) { @SuppressWarnings("unchecked") Map<String, List<String>> headers = (Map<String, List<String>>) context.get(MessageContext.HTTP_REQUEST_HEADERS); if (headers == null) headers = new HashMap<>(); headers.put("Content-Type", Collections.singletonList("text/xml;charset=utf-8")); context.put(MessageContext.HTTP_REQUEST_HEADERS, headers); } return true; } @Override public boolean handleFault(SOAPMessageContext context) { return true; } @Override public void close(MessageContext context) {} }
2. 在客户端注册拦截器
public static void main(String[] args) { WaselClient waselClient = new WaselClient(); WaselAddressService waselAddressService = new WaselAddressService(); IWaselAddressService iWaselAddressService = waselAddressService.getBasicHttpBindingIWaselAddressService(); // 新增:注册拦截器 BindingProvider bp = (BindingProvider) iWaselAddressService; List<Handler> handlerChain = bp.getBinding().getHandlerChain(); handlerChain.add(new ContentTypeFixHandler()); bp.getBinding().setHandlerChain(handlerChain); try { GetAddressResponseStructure address = iWaselAddressService.getIndividualWaselAddress(ItemChoiceType.ID, "999999"); System.out.println("" + address.getGetIndividualWaselAddressResponseDetailObject() .getWaselAddress() .get(1)); } catch (IWaselAddressServiceGetIndividualWaselAddressCommonErrorElementFaultMessage e) { System.out.println(e.getMessage()); } }
Postman调用补充说明
Postman需要手动配置请求参数:
- 请求方法设为POST
- 添加请求头:
Content-Type: text/xml;charset=utf-8 - 请求体复制SOAP UI中能正常工作的SOAP报文,确保格式符合服务端要求
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

