语境
我们使用带javax.ws.rs.ext.ExceptionMapper<Exception>注释的 as@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>仍然处理所有其他异常。
我已经尝试过的
“复制”专门的ExceptionMapper
我将自己的资源放在我的javax.ws.rs.ext.ExceptionMapper<javax.validation.ConstraintViolationException>资源旁边,希望它优先于 CXF 资源。
仍然org.apache.cxf.jaxrs.validation.ValidationExceptionMapper优先。
更新:事实证明这确实有效。我不知道为什么我的初始测试不起作用。
禁用过ValidationExceptionMapper孔system.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优先?