ExceptionMapper<Throwable> 未在 ForbiddenException 上调用
ExceptionMapper<Throwable> not called on ForbiddenException
我在 Spring Boot 中使用 Jersey。我有一个通过 ResourceConfig.register(MyExceptionMapper.class)
注册的 ExceptionMapper<Throwable>
并且用 @Provider
.
注释
如果我的代码抛出 RuntimeException
MyExceptionMapper.toResponse()
会被调用。
但是,如果我的应用程序抛出 javax.ws.rs.ForbiddenException
,那么我的 ExceptionMapper
不会被调用,即使它是 ExceptionMapper<Throwable>
。
我假设 Jersey 有一个默认的 ExceptionMapper
正在处理 WebApplicationException
(我假设)。我该如何自定义它?
我真正想做的是在任何 Throwable
的情况下添加 DEBUG 日志记录(其余代码对于非 WebApplicationException 工作正常)。有更好的方法吗?
所以分为两部分:
首先,Jersey 没有达到我的 ExceptionMapper
的原因是它只有在内部不支持映射的情况下才会尝试这样做。 ServerRuntime.Responder
class 尝试映射任何 WebApplicationException
。只有当由于任何原因这没有成功时,才会向 ExceptionMapper
提供异常(至少这是我所看到的行为)。
其次,有几种添加日志记录的方法:
- 设置
ServerRuntime.Responder
的日志记录级别。对我来说,这太宽泛了,因为它会记录所有响应而不仅仅是异常。此处对此进行了描述:
我采用的解决方案是添加一个 ContainerResponseFilter
并从 ContainerRequest
中获取异常。这在此处有所描述:
public class ExceptionsLoggingContainerResponseFilter 实现 ContainerResponseFilter {
private final static Logger LOGGER = LoggerFactory.getLogger(ExceptionsLoggingContainerResponseFilter.class);
@Override
public void filter(ContainerRequestContext 请求,
ContainerResponseContext 响应){
Throwable throwable = ((ContainerRequest)response).getMappedThrowable();
如果(可抛出!= null){
LOGGER.info(buildErrorMessage(request), throwable);
}
}
我在 Spring Boot 中使用 Jersey。我有一个通过 ResourceConfig.register(MyExceptionMapper.class)
注册的 ExceptionMapper<Throwable>
并且用 @Provider
.
如果我的代码抛出 RuntimeException
MyExceptionMapper.toResponse()
会被调用。
但是,如果我的应用程序抛出 javax.ws.rs.ForbiddenException
,那么我的 ExceptionMapper
不会被调用,即使它是 ExceptionMapper<Throwable>
。
我假设 Jersey 有一个默认的 ExceptionMapper
正在处理 WebApplicationException
(我假设)。我该如何自定义它?
我真正想做的是在任何 Throwable
的情况下添加 DEBUG 日志记录(其余代码对于非 WebApplicationException 工作正常)。有更好的方法吗?
所以分为两部分:
首先,Jersey 没有达到我的 ExceptionMapper
的原因是它只有在内部不支持映射的情况下才会尝试这样做。 ServerRuntime.Responder
class 尝试映射任何 WebApplicationException
。只有当由于任何原因这没有成功时,才会向 ExceptionMapper
提供异常(至少这是我所看到的行为)。
其次,有几种添加日志记录的方法:
- 设置
ServerRuntime.Responder
的日志记录级别。对我来说,这太宽泛了,因为它会记录所有响应而不仅仅是异常。此处对此进行了描述: 我采用的解决方案是添加一个
ContainerResponseFilter
并从ContainerRequest
中获取异常。这在此处有所描述:public class ExceptionsLoggingContainerResponseFilter 实现 ContainerResponseFilter { private final static Logger LOGGER = LoggerFactory.getLogger(ExceptionsLoggingContainerResponseFilter.class);
@Override public void filter(ContainerRequestContext 请求, ContainerResponseContext 响应){ Throwable throwable = ((ContainerRequest)response).getMappedThrowable(); 如果(可抛出!= null){ LOGGER.info(buildErrorMessage(request), throwable); } }