语境
我们使用带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
优先?