我在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)。有更好的方法吗?
答案 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); } }