【发布时间】:2015-11-17 14:55:29
【问题描述】:
上下文
我们使用注释为@javax.ws.rs.ext.Provider 的javax.ws.rs.ext.ExceptionMapper<Exception> 来处理所有异常。在内部,这个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 也被发现,现在充当javax.validation.ConstraintViolationException 的首选ExceptionMapper。我们自己的ExceptionMapper 无法运行,因此客户端无法获得有关验证期间出现问题的信息。
我们自己的ExceptionMapper<Exception> 仍然处理所有其他异常。
我已经尝试过的
“复制”专门的ExceptionMapper
我将自己的javax.ws.rs.ext.ExceptionMapper<javax.validation.ConstraintViolationException> 放在我的资源旁边,希望它优先于 CXF。
org.apache.cxf.jaxrs.validation.ValidationExceptionMapper 仍然优先。
更新:事实证明这确实有效。我不知道为什么我的初始测试不起作用。
通过system.properties禁用ValidationExceptionMapper
在TomEE 7.0.0-SNAPSHOT 的changelog 中我注意到了
TOMEE-1336 支持自动发现提供程序的 classname.activated = true/false
查看相应的changeset 我希望我可以通过添加禁用org.apache.cxf.jaxrs.validation.ValidationExceptionMapper
org.apache.cxf.jaxrs.validation.ValidationExceptionMapper.activated=false
到我们的system.properties。
这仍然无效。
问题
- 这是 CXF 还是 TomEE 行为?
- 我们如何配置
ExceptionMapper优先?
【问题讨论】:
标签: java cxf bean-validation apache-tomee tomee-7