ExceptionMapper <throwable>未在ForbiddenException上调用

时间:2017-12-12 14:20:03

标签: java spring-boot jersey

我在Spring Boot中使用Jersey。我通过ExceptionMapper<Throwable>注册了ResourceConfig.register(MyExceptionMapper.class),并使用@Provider进行了注释。

如果我的代码抛出RuntimeException MyExceptionMapper.toResponse(),则会被调用。

但是,如果我的应用程序抛出javax.ws.rs.ForbiddenException,那么即使它是ExceptionMapper,我的ExceptionMapper<Throwable>也不会被调用。

我假设泽西岛有一个默认ExceptionMapper正在处理WebApplicationException(我假设)。我该如何定制?

我真正想要的是在任何Throwable的情况下添加DEBUG日志记录(其余代码适用于非WebApplicationException)。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

这两部分:

首先,泽西没有命中我的ExceptionMapper的原因是,如果它不在内部支持映射,它只会尝试这样做。 ServerRuntime.Responder班级会尝试映射任何WebApplicationException。只有当这个因任何原因不成功时才会向ExceptionMapper提供异常(至少这是我见过的行为)。

其次,有几种方法可以添加日志记录:

  • 设置ServerRuntime.Responder的日志记录级别。对我而言,这太过宽泛,因为它会记录所有回复,而不仅仅是异常。这在此处描述:https://stackoverflow.com/a/41484564/905762
  • 我使用的解决方案是添加ContainerResponseFilter并从ContainerRequest获取例外。这在这里有所描述:https://stackoverflow.com/a/19680862/905762

    public class ExceptionsLoggingContainerResponseFilter实现ContainerResponseFilter { private final static Logger LOGGER = LoggerFactory.getLogger(ExceptionsLoggingContainerResponseFilter.class);

    @覆盖 public void filter(ContainerRequestContext请求,     ContainerResponseContext响应){     Throwable throwable =((ContainerRequest)response).getMappedThrowable();     if(throwable!= null){         LOGGER.info(buildErrorMessage(request),throwable);     } }