使用jdk 8的默认jaxws-ri实现禁用soap客户端的soap验证

时间:2019-03-15 08:35:42

标签: java web-services soap jax-ws jax-ws-customization

我的环境是一个带有Spring Boot的Maven项目。 我正在使用wsimport从WSDL生成JAX-WS代码。 我想在收到肥皂响应时禁用肥皂验证。我正在使用jdk8的jax-WS的默认实现。代码看起来像这样:

//(1)现在构建Web服务客户端

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);

我在google中搜索,发现了一个禁用验证的选项:

(3)bindingProvider.getRequestContext()。put(“ set-jaxb-validation-event-handler”,sc.getSocketFactory());

但是我似乎jdk8的jax-WS的默认实现不接受此选项,但是apache cxf接受了此选项。那么,如何在jdk8的jax-ws的默认实现中停用验证?有没有一种方法可以在我的项目中加载cxf实现,因此我可以使用上一个选项来停用验证?有没有一种方法可以自定义xml验证?

1 个答案:

答案 0 :(得分:0)

我没有找到禁用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工件)以强制执行A​​pache cxf实现

  3. 禁用验证 bindingProvider.getRequestContext()。put(“ set-jaxb-validation-event-handler”,“ false”);