【问题标题】:Is it possible to control set-jaxb-validation-event-handler programmatically?是否可以以编程方式控制 set-jaxb-validation-event-handler?
【发布时间】:2015-04-16 10:03:35
【问题描述】:

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

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

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

谢谢。

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

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

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

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

【问题讨论】:

  • 结合 Spring 的 PropertyPlaceHolderConfigurer 和禁用 spring 配置文件的模式验证是可行的。能够在运行时禁用它有什么意义?您是否打算将验证从一个请求切换到下一个请求?
  • 我没有在这个应用程序中使用 Spring,所以它不是一个选项。不,验证不会从一个请求切换到下一个请求,但我希望它是可控的,无需更改代码或重新启动服务器。最简单的方法似乎是将设置保存在数据库中。

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


【解决方案1】:

是的,有可能。

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

【讨论】:

  • 这确实适用于客户端,但我正在寻找服务器端的解决方案。还是谢谢!
【解决方案2】:

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

当我在 JBoss EAP 6.0 上运行 CXF 时,我在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>

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      相关资源
      最近更新 更多