我的环境是一个带弹簧靴的maven项目。我正在使用wsimport从WSDL生成JAX-WS代码。我想在收到肥皂回复时禁用肥皂验证。我正在使用jdk8的jax-WS的默认实现。代码如下所示:
//(1)现在构建webservice客户端
MyWS_Service service = new MyWS_Service(null, new QName("http://...", "MyWS"));
MyWS port = service.getMyWSSOAP();
BindingProvider bindingProvider = (BindingProvider) port;
//(2)禁用验证
bindingProvider.getRequestContext().put("set-jaxb-validation-event-handler", "false");
// set endpoint
bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http//...endpointaddress");
//(3)执行请求
respObj = port.myRequest(myRequestObj);
我在谷歌搜索,我发现一个禁用验证的选项:
(3)bindingProvider.getRequestContext()。put(“set-jaxb-validation-event-handler”,sc.getSocketFactory());
但我似乎jdk8的jax-WS的默认实现不接受此选项,但它被apache cxf接受。那么,如何在jdk8的jax-ws的默认实现中取消激活验证?有没有办法在我的项目中加载cxf实现,所以我使用前面的选项来取消激活验证?有没有办法自定义xml验证?
我没有找到禁用jaxb xml验证的解决方案,但是我找到了一种方法将apache cxf集成到我的项目,解决方案很简单,我只是将它添加到我的项目中
<!--apache cxf implementation -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${apache.cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${apache.cxf.version}</version>
</dependency>
我强制绑定提供程序禁用验证
bindingProvider.getRequestContext().put("set-jaxb-validation-event-handler", "false");
事实上,jdk类javax.xml.ws.spi.FactoryFinder#find
将在CLASSPATH中搜索javax.xml.ws.spi.Provider
文件的存在,如果不可用,则回退到默认的Sun实现。
我从这个链接中获得灵感:force jax-ws apache cxf implementation
所以这些都是以下步骤: