在CXF SOAP Web服务中,我使用以下注释来禁用xsd验证:
@EndpointProperties({
@EndpointProperty(key = "set-jaxb-validation-event-handler", value = "false")
})
我希望在运行时控制验证(根据从数据库检索的设置的值启用/禁用它)。我的问题是:是否可以在运行时禁用/启用此处理程序?也许是通过编写自定义事件处理程序而根本不使用此属性?
感谢。
编辑一个选项不会禁用set-jaxb-validation-handler
的验证,而是隐藏ValidationEventHandler的子类。正如here所解释的那样,我将检查handleEvent
中的数据库设置并根据其值返回。
但是这种方法仍有一些缺点:首先,这个web服务配置了注释,我似乎无法找到一种方法来应用ValidationEventHandler
注释(同样的问题:{{ 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>