使用JDK 8默认的JAX-WS RI实现来禁用SOAP客户端的SOAP验证。

3

我的环境是一个使用Spring Boot的Maven项目。 我正在使用wsimport从WSDL生成JAX-WS代码。 当我接收到SOAP响应时,我想要禁用SOAP验证。 我正在使用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验证的方法?

1个回答

1

我没有找到禁用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 因此,以下是所有步骤:
  1. 使用wsimport生成存根
  2. 将cxf-rt-frontend-jaxws-*.jar添加到类路径(通过mvn添加cxf-rt-frontend-jaxws工件),以强制使用Apache CXF实现
  3. 禁用验证 bindingProvider.getRequestContext().put("set-jaxb-validation-event-handler", "false");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接