我使用Jersey和Jackson在Glassfish 3.1.2下运行RESTful Web服务:
@Stateless
@LocalBean
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("users")
public class UserRestService {
private static final Logger log = ...;
@GET
@Path("{userId:[0-9]+}")
public User getUser(@PathParam("userId") Long userId) {
User user;
user = loadUserByIdAndThrowApplicableWebApplicationExceptionIfNotFound(userId);
return user;
}
}
Run Code Online (Sandbox Code Playgroud)
对于预期的异常,我抛出适当的WebApplicationException
,我对发生意外异常时返回的HTTP 500状态感到满意.
我现在想为这些意外的异常添加日志记录,但是尽管搜索,但是无法找到我应该如何处理这个问题.
我已经尝试使用a Thread.UncaughtExceptionHandler
并且可以确认它是在方法体内应用的,但是它的uncaughtException
方法永远不会被调用,因为其他东西在它们到达我的处理程序之前处理未捕获的异常.
我见过一些人使用的另一个选项是ExceptionMapper
,它捕获所有异常,然后过滤掉WebApplicationExceptions:
@Provider
public class ExampleExceptionMapper implements ExceptionMapper<Throwable> {
private static final Logger log = ...;
public Response toResponse(Throwable t) {
if (t instanceof WebApplicationException) {
return ((WebApplicationException)t).getResponse();
} …
Run Code Online (Sandbox Code Playgroud)