是否可以通过编程方式控制 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>
在 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>