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

Is it possible to control set-jaxb-validation-event-handler programmatically?

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

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

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

谢谢。

编辑: 一个选项是不禁用 set-jaxb-validation-handler 的验证,而是子类 ValidationEventHandler. As explained here,然后我会检查数据库设置handleEvent 和 return 根据其值。

但这种方法仍有一些缺点:首先,此 web 服务配置了注释,我似乎无法找到一种方法来应用带有注释的 ValidationEventHandler(同样的问题: How to set custom ValidationEventHandler on JAXB unmarshaller when using annotations).

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

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

我终于找到了可行的解决方案。

由于我是 运行 CXF on JBoss EAP 6.0,我将以下配置添加到 standalone.xml 中的 webservices 子系统:

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

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

是的,有可能。

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

对于那些试图在总线级别进行配置的人来说,以下方法对我有用:

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