是否可以通过编程方式控制set-jaxb-validation-event-handler?

时间:2015-04-16 10:03:35

标签: java web-services cxf jax-ws jboss7.x

在CXF SOAP Web服务中,我使用以下注释来禁用xsd验证:

@EndpointProperties({ 
    @EndpointProperty(key = "set-jaxb-validation-event-handler", value = "false") 
})

我希望在运行时控制验证(根据从数据库检索的设置的值启用/禁用它)。我的问题是:是否可以在运行时禁用/启用此处理程序?也许是通过编写自定义事件处理程序而根本不使用此属性?

感谢。

编辑一个选项不会禁用set-jaxb-validation-handler的验证,而是隐藏ValidationEventHandler的子类。正如here所解释的那样,我将检查handleEvent中的数据库设置并根据其值返回。

但是这种方法仍有一些缺点:首先,这个web服务配置了注释,我似乎无法找到一种方法来应用ValidationEventHandler注释(同样的问题:{{ 3}})。

其次,这意味着即使我不需要验证也会执行;然后我会失去任何性能上的好处。

它实际上并不完全符合我的需要,所以我仍然愿意接受任何建议。

3 个答案:

答案 0 :(得分:7)

是的,这是可能的。

MyService service = new MyService();
MyServiceInterface port = service.getMyServicePort();
BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext().put(
    "set-jaxb-validation-event-handler", Boolean.FALSE);

答案 1 :(得分:2)

我终于找到了一个有效的解决方案。

当我在JBoss EAP 6.0上运行CXF时,我将以下配置添加到standalone.xml中的webservices subsytem:

<subsystem xmlns="urn:jboss:domain:webservices:1.2">
    <!-- ... -->
    <endpoint-config name="myconfig">
        <property name="set-jaxb-validation-event-handler" value="false"/>
    </endpoint-config>
    <!-- ...-->
</subsystem>

以下对SEI实施的注释:

@org.jboss.ws.api.annotation.EndpointConfig(configName = "myconfig")

这是相关的Maven依赖:

    <dependency>
        <groupId>org.jboss.ws</groupId>
        <artifactId>jbossws-api</artifactId>
        <version>1.0.1.Final</version>
        <scope>provided</scope>
    </dependency>

如果我们想要更改属性值,我们仍然需要重新启动服务器,但它是一个较小的邪恶。

答案 2 :(得分:2)

对于尝试在总线级别配置它的人,以下内容对我有用:

<cxf:bus id="soapClientCxfBus" bus="soapClientCxfBus" >
    <cxf:properties>
        <entry key="set-jaxb-validation-event-handler" value="false" />
    </cxf:properties>
</cxf:bus>