TomEE 7上bean验证的自定义异常映射?

时间:2015-11-17 14:55:29

标签: java cxf bean-validation tomee tomee-7

上下文

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

如果是javax.validation.ConstraintViolationException,我们会返回有关哪个字段无效以及原因无效的其他信息。

问题

我们刚刚从TomEE 1.7.2 JAX-RS切换到TomEE 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>仍处理所有其他例外情况。

我已经尝试了什么

&#34;重复&#34;专门的ExceptionMapper

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

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

更新:事实证明这确实可以解决问题。我不知道为什么我的初步测试没有用。

通过ValidationExceptionMapper

停用system.properties

TomEE 7.0.0-SNAPSHOT org.apache.cxf.jaxrs.validation.ValidationExceptionMapper我注意到了

  

changelog支持自动发现的提供商的classname.activated = true / false

查看相应的TOMEE-1336我希望我可以通过添加来禁用system.properties     org.apache.cxf.jaxrs.validation.ValidationExceptionMapper.activated = FALSE 到我们的ExceptionMapper

这仍然没有效果。

问题

  • 这是CXF还是TomEE的行为?
  • 我们如何配置哪个{{1}}优先?

1 个答案:

答案 0 :(得分:6)

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

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

没有优先级因为使用了异常层次结构。

编辑:遗漏了一部分:你需要impl ExceptionMapper{ValidationException}否则CXF的优先级高于你自己的优先级(异常不太具体) 编辑2:https://issues.apache.org/jira/browse/TOMEE-1656表示已激活的支持