JBoss EAP7中如何让自定义ExceptionMapper捕获Jackson反序列化异常
针对JBoss EAP 7 + RESTeasy + Jackson环境下,自定义StandardExceptionMapper无法捕获JSON反序列化异常的问题,以下是几个可行的解决方案:
方案1:覆盖特定Jackson异常的内置Mapper
RESTeasy会优先匹配更具体的ExceptionMapper,我们可以创建自定义Mapper专门处理Jackson的JsonParseException和JsonMappingException(这两个是UnrecognizedPropertyException等反序列化异常的父类),再将这些异常转发到统一的StandardExceptionMapper处理。
创建两个自定义Provider类:
@Provider public class CustomJsonParseExceptionMapper implements ExceptionMapper<JsonParseException> { @Inject private StandardExceptionMapper standardExceptionMapper; @Override public Response toResponse(JsonParseException exception) { // 复用统一异常处理逻辑 return standardExceptionMapper.toResponse(exception); } }
@Provider public class CustomJsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException> { @Inject private StandardExceptionMapper standardExceptionMapper; @Override public Response toResponse(JsonMappingException exception) { return standardExceptionMapper.toResponse(exception); } }
应用启动后,这两个自定义Mapper会优先于内置的Jackson Mapper生效,既保留其他内置Provider的功能,又能让统一处理逻辑接管所有JSON解析/映射异常。
方案2:通过jboss-deployment-structure.xml排除内置Mapper
JBoss EAP 7中Jackson的JAX-RS Provider是以org.jboss.resteasy.resteasy-jackson2-provider模块形式存在的,我们可以在部署描述符中排除其中的特定Mapper类:
在WEB-INF目录下创建jboss-deployment-structure.xml:
<jboss-deployment-structure> <deployment> <exclusions> <module name="org.jboss.resteasy.resteasy-jackson2-provider"> <imports> <exclude path="com/fasterxml/jackson/jaxrs/base/JsonParseExceptionMapper.class"/> <exclude path="com/fasterxml/jackson/jaxrs/base/JsonMappingExceptionMapper.class"/> </imports> </module> </exclusions> <!-- 确保应用内的Provider优先加载 --> <local-last value="false"/> </deployment> </jboss-deployment-structure>
该配置会移除内置的两个Jackson异常Mapper,此时你的StandardExceptionMapper就能捕获所有未被其他更具体Mapper处理的异常,包括Jackson的反序列化异常。
方案3:调整自定义Mapper的优先级
在StandardExceptionMapper上添加@Priority注解,设置比内置Mapper更高的优先级:
@Provider @Priority(Priority.HIGHEST) public class StandardExceptionMapper implements ExceptionMapper<Exception> { // 你的异常处理逻辑 }
注意:过高的优先级可能会影响其他内置Provider的正常工作,比如覆盖部分特定异常的默认处理逻辑,因此优先推荐方案1或2。
内容的提问来源于stack exchange,提问作者eerriicc

