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); } }