8

语境

我们使用带javax.ws.rs.ext.ExceptionMapper<Exception>注释的 as@javax.ws.rs.ext.Provider来处理所有异常。在内部,这ExceptionMapper是区分不同类型的异常以确定要向客户显示哪些信息。

在 的情况下javax.validation.ConstraintViolationException,我们返回有关哪个字段无效以及原因的附加信息。

问题

我们刚刚从 切换TomEE 1.7.2 JAX-RSTomEE 7.0.0-SNAPSHOT webprofile

随着TomEE 1.7.2 JAX-RS我们使用openejb.jaxrs.providers.auto=true系统属性,我们ExceptionMapper会被自动找到并使用。

TomEE 7.0.0-SNAPSHOT webprofile不再需要使用该属性来从自动发现中受益。

然而,也被发现,org.apache.cxf.jaxrs.validation.ValidationExceptionMapper现在作为ExceptionMapper. javax.validation.ConstraintViolationException我们自己的ExceptionMapper没有运行,因此客户端无法获得有关验证期间出错的信息。

我们自己的ExceptionMapper<Exception>仍然处理所有其他异常。

我已经尝试过的

“复制”专门的ExceptionMapper

我将自己的资源放在我的javax.ws.rs.ext.ExceptionMapper<javax.validation.ConstraintViolationException>资源旁边,希望它优先于 CXF 资源。

仍然org.apache.cxf.jaxrs.validation.ValidationExceptionMapper优先。

更新:事实证明这确实有效。我不知道为什么我的初始测试不起作用。

禁用过ValidationExceptionMappersystem.properties

在我注意到的更新日志TomEE 7.0.0-SNAPSHOT

TOMEE-1336支持自动发现的提供者的 classname.activated = true/false

查看相应的变更集,我希望我可以org.apache.cxf.jaxrs.validation.ValidationExceptionMapper通过将 org.apache.cxf.jaxrs.validation.ValidationExceptionMapper.activated=false 添加到我们的system.properties.

这仍然没有效果。

问题

  • 这是 CXF 还是 TomEE 行为?
  • 我们如何配置哪个ExceptionMapper优先?
4

1 回答 1

6

现在需要一些时间,但认为规范需要它,但您可以通过设置禁用它cxf.jaxrs.skip-provider-scanning=true

它完全禁用了自动提供程序,包括扫描的提供程序,但是您可以控制您想要的提供程序openejb-jar.xml- 恕我直言,这肯定是最好和更安全的解决方案,否则您将依赖于您使用的许多库和容器设置。

由于使用了异常层次结构,因此没有优先级 afaik。

编辑:错过了一部分:你需要暗示ExceptionMapper{ValidationException}CXF 一个比你自己的优先级更高(例外不太具体)编辑 2:https ://issues.apache.org/jira/browse/TOMEE-1656用于激活的支持

于 2015-11-17T15:16:09.477 回答