Weblogic12c部署JAXWS客户端发送base64Binary自动加边界信息如何解决
问题原因
- 该问题由WebLogic 12c内置的JAX-WS(Metro技术栈)默认base64Binary类型优化逻辑导致:即使显式关闭了端口绑定的MTOM属性,当框架检测到SOAP报文中存在xsd:base64Binary类型字段时,仍会自动注入XOP命名空间,甚至将请求Content-Type自动切换为multipart/related格式,不符合被调用服务要求的text/xml格式,触发415不支持媒体类型错误。
- 本地测试运行正常是因为本地环境默认使用JDK自带的JAX-WS实现,不存在WebLogic的这套专属优化逻辑,base64内容会直接内联传输,无额外命名空间和格式修改。
- 将XSD字段类型改为string后调用正常,是因为绕开了WebLogic针对base64Binary类型的专属优化触发条件。
修复方案
方案1:端口请求上下文添加禁用优化配置(优先级最高,代码改动最小)
在初始化Port实例后、发起SOAP调用前,添加如下配置显式禁用XOP和MTOM相关优化:
SOAPBinding binding = (SOAPBinding) ((BindingProvider) port).getBinding(); binding.setMTOMEnabled(false); // 适配Metro栈禁用内容优化 ((BindingProvider) port).getRequestContext().put("com.sun.xml.ws.transport.http.client.HttpTransportPipe.DISABLE_CONTENT_OPTIMIZATION", true); // 增加WebLogic专属配置双保险 ((BindingProvider) port).getRequestContext().put("weblogic.wsee.jaxws.mtom.disable", true);
方案2:客户端代码生成阶段禁用XOP优化
使用wsimport工具生成客户端代码时,添加-Xdisable-XOP参数:
wsimport -keep -Xdisable-XOP [你的WSDL地址]
生成的代码会自动携带禁用XOP优化的注解,从根源避免base64Binary字段被特殊处理。
方案3:WebLogic控制台配置模块级优化策略
登录WebLogic管理控制台,按路径操作:部署 -> 找到对应EAR模块 -> 配置 -> Web服务 -> 找到对应JAX-WS客户端引用 -> 取消勾选启用MTOM选项,同时将XOP处理阈值设置为最大值,保存配置后重启服务生效。
方案4:强制指定请求Content-Type(兜底方案)
如果上述配置均不生效,可在请求上下文硬编码覆盖Content-Type属性:
Map<String, Object> reqCtx = ((BindingProvider) port).getRequestContext(); reqCtx.put(BindingProvider.SOAPACTION_USE_PROPERTY, true); reqCtx.put(BindingProvider.SOAPACTION_URI_PROPERTY, "对应服务的SOAPAction值"); // 强制指定Content-Type为服务要求的格式 reqCtx.put("com.sun.xml.ws.client.Content-Type", "text/xml; charset=utf-8");
内容的提问来源于stack exchange,提问作者user2053446
相关产品推荐
相关产品推荐

