用于 TomEE 7 上的 bean 验证的自定义异常映射?
Custom exception mapping for bean validation on TomEE 7?
上下文
我们使用注释为@javax.ws.rs.ext.Provider
的javax.ws.rs.ext.ExceptionMapper<Exception>
来处理所有异常。在内部,此 ExceptionMapper
区分不同类型的异常以确定向客户端显示哪些信息。
对于 javax.validation.ConstraintViolationException
,我们 return 关于哪个字段无效及其原因的附加信息。
问题
我们刚刚从 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>
仍然处理所有其他异常。
我已经尝试过的
"duplicate" 专业化 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 Support classname.activated = true/false for auto discovered providers
查看相应的 changeset 我希望我可以通过添加来禁用 org.apache.cxf.jaxrs.validation.ValidationExceptionMapper
org.apache.cxf.jaxrs.validation.ValidationExceptionMapper.activated=假
到我们的 system.properties
.
这仍然没有效果。
问题
- 这是 CXF 还是 TomEE 行为?
- 我们如何配置哪个
ExceptionMapper
优先?
现在花一些时间,但认为规范需要它,但您可以通过设置 cxf.jaxrs.skip-provider-scanning=true
.
来禁用它
它完全禁用自动提供程序,包括扫描的自动提供程序,但随后您可以在 openejb-jar.xml
中控制您想要的自动提供程序 - 恕我直言,这肯定是最好和更安全的解决方案,否则您将依赖很多库和容器设置使用。
没有优先级 afaik,因为使用了异常层次结构。
编辑:遗漏了一部分:你需要实现 ExceptionMapper{ValidationException}
否则 CXF 的优先级高于你自己的(例外不太具体)
编辑 2:https://issues.apache.org/jira/browse/TOMEE-1656 激活支持
上下文
我们使用注释为@javax.ws.rs.ext.Provider
的javax.ws.rs.ext.ExceptionMapper<Exception>
来处理所有异常。在内部,此 ExceptionMapper
区分不同类型的异常以确定向客户端显示哪些信息。
对于 javax.validation.ConstraintViolationException
,我们 return 关于哪个字段无效及其原因的附加信息。
问题
我们刚刚从 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>
仍然处理所有其他异常。
我已经尝试过的
"duplicate" 专业化 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 Support classname.activated = true/false for auto discovered providers
查看相应的 changeset 我希望我可以通过添加来禁用 org.apache.cxf.jaxrs.validation.ValidationExceptionMapper
org.apache.cxf.jaxrs.validation.ValidationExceptionMapper.activated=假
到我们的 system.properties
.
这仍然没有效果。
问题
- 这是 CXF 还是 TomEE 行为?
- 我们如何配置哪个
ExceptionMapper
优先?
现在花一些时间,但认为规范需要它,但您可以通过设置 cxf.jaxrs.skip-provider-scanning=true
.
它完全禁用自动提供程序,包括扫描的自动提供程序,但随后您可以在 openejb-jar.xml
中控制您想要的自动提供程序 - 恕我直言,这肯定是最好和更安全的解决方案,否则您将依赖很多库和容器设置使用。
没有优先级 afaik,因为使用了异常层次结构。
编辑:遗漏了一部分:你需要实现 ExceptionMapper{ValidationException}
否则 CXF 的优先级高于你自己的(例外不太具体)
编辑 2:https://issues.apache.org/jira/browse/TOMEE-1656 激活支持