2012-09-19 76 views
2

我想确定是否有可能在REST资源上设置类似解决方案的拦截器,这样如果引发异常,我可以记录异常并更改返回的响应。我基本上不想用try/catch块来包装所有的REST资源。如果一个REST资源被管理,我只会在我的所有呼叫中使用一个@Interceptor,但是因为它不被管理,似乎没有问题。REST资源异常拦截器

回答

2

您可以使用实施javax.ws.rs.ext.ExceptionMapper。假设您的代码可能会从资源中抛出YourFancyException。然后你可以使用下面的映射:

@Provider 
public class YourFancyExceptionMapper 
       implements ExceptionMapper <YourFancyException> { 
    @Override 
    public Response toResponse(YourFancyException exception) { 
     return Response.status(Response.Status.BAD_REQUEST) 
         .entity(exception.getMessage()).build(); 
    } 
} 

不要忘了@Provider注释映射器,使您的资源的方法抛出YourFancyException

+0

有没有办法按照每种方法做到这一点?我不希望它改变传统资源。另外,如果我为“异常”做了这个,它会捕获所有异常吗? – EpicOfChaos

+1

它工作在“每个异常”的基础上,而不是“每个方法”,但映射器仅捕获资源方法抛出的异常。所以,它不应该成为遗留资源的问题,因为我们已经用try/catch处理异常了。是的,如果您使用映射器作为“Exception”,它会捕获所有异常(从资源方法抛出)。 – dcernahoschi