2012-11-05 75 views
1

如果找不到匹配的JAX-RS资源,我正在寻找显示自定义错误页面的方式。我的想法是使用ExceptionMapper,但我不知道该异常类的使用方法:JAX-RS 404 Not Found ExceptionMapper

@Provider 
public class NotFoundMapper implements ExceptionMapper<WHATEXCEPTION?> { 
    ... 
} 

RestEasy的具有专有NotFoundException,但有与新泽西州的作品,也是一个办法吗?理想的是符合标准的方式?

+0

新泽西州实现自己的['NotFoundException'](http://jersey.java.net/nonav/apidocs/1.5/jersey/com/sun/jersey/api/NotFoundException.html) – toniedzwiedz

+0

我在玩泽西岛2.0(里程碑),可以找到一个['NotFoundException'](http://jersey.java.net/nonav/apidocs/snapshot/jersey/javax/ws/rs/NotFoundException.html)只在客户端。如果没有找到资源,你知道泽西岛2.0使用什么异常吗? – deamon

+0

我还不熟悉Jersey 2.0。在我的Jersey 1.8应用程序中,我抛出'com.sun.jersey.api.NotFoundException',它也可以使用'javax.ws.rs.WebApplicationException',你可以传递一个异常和一个'javax.ws.rs.core .Response'实例给它的构造函数。泽西岛应该弄清楚,如果你建立“响应”有一个404状态。 – toniedzwiedz

回答

2

你的意思是如果你的休息服务在localhost/rest下监听,那么localhost/rest/asdf应该返回给你一个自定义的404页面?它特定于JAX-RS引擎,您必须检查Jersey的源代码。例如,CXF抛出一个WebApplicationException,但它没有提供任何方式来定制它。见JAXRSInInterceptor.processRequest()线156,看看它是如何做:

org.apache.cxf.common.i18n.Message errorMsg = 
     new org.apache.cxf.common.i18n.Message("NO_ROOT_EXC", 
              BUNDLE, 
              message.get(Message.REQUEST_URI), 
              rawPath); 
    LOG.warning(errorMsg.toString()); 
    Response resp = JAXRSUtils.createResponse(resource, message, errorMsg.toString(), 
      Response.Status.NOT_FOUND.getStatusCode(), false); 
    throw new WebApplicationException(resp); 

总之没有好和标准的方式,你可以尝试使用请求过滤器或ExceptionMapper

+0

我的意思是,框架表示没有找到资源我想处理这个(例外)。我不想抛出自己的异常,我想获得框架抛出的异常。 – deamon

+1

哦,我明白了。所以你的意思是如果你的休息服务在http:// localhost/rest下监听,那么http:// localhost/rest/asdf应该返回一个自定义的404页面?它特定于JAX-RS引擎,您必须检查Jersey的源代码。例如在CXF中,在这种情况下会引发WebApplicationException。这是一个标准的javax异常,也许其他引擎会抛出相同的异常。在cxf中,您可以检查JAXRSInInterceptor processRequest行156以了解它是如何处理的。总结一下没有很好的标准方法,你可以尝试使用请求过滤器或者ExceptionMapper –

+0

谢谢。如果你用你的评论替换你的答案,我会接受它作为解决方案。 – deamon