2012-04-20 62 views
2

我已经写了一些例外映射器来捕获和处理的内置休息容易例外像NotFoundException,MethodNotAllowedException等,样本代码没有捕获的异常:RestEasy的内置如图异常映射

@Provider 
public class NotFoundExceptionMapper implements ExceptionMapper<org.jboss.resteasy.spi.NotFoundException> 
{ 
    @Override 
    Response toResponse(org.jboss.resteasy.spi.NotFoundException exception) { 
     return Response.status(500).build(); 
     } 
} 

我也在我的网页过滤器类中写了一个try catch块。每当发生NotFoundException时,它都不会在映射器中捕获,但会转到过滤器中的catch块。

虽然我已经尝试过另一个异常映射器类来处理JsonParsingException。这是工作正常,每当发生Json Parse异常时,都会从映射程序给出正确的响应。

该问题仅限于再次发生异常的情况。 另外,提供程序已使用组件扫描内的include-filter标记在应用程序上下文中注册。

请指导我如何在映射程序类本身中找到休息方便的内置异常。

问候, RM

回答

1

我有同样的问题。使用@Component注释NotFoundExceptionMapper应该修复它(或者将NotFoundExceptionMapper作为一个bean添加到您的应用程序上下文(xml文件))。

当你的Spring上下文开始NotFoundExceptionMapper应进行登记(你应该像在你的日志“预实例独身......”)

0

我想同样的事情而陷入困境,同时试图映射UnsupportedMediaTypeException。

根据http://docs.jboss.org/resteasy/docs/1.1.GA/userguide/html/ExceptionHandling.html和异常映射器部分的第一行,似乎您只能映射应用程序异常。

+0

我有完全相同的问题,我已经设置注释@Provider我的自定义ExceptionMapper也注册在网络映射器。XML仍然没有效果,映射器不处理异常。我试图使用RuntimeExceptions和Exception来扩展,但没有differens .... – Balflear 2014-09-11 14:23:41

2

这里是我的演示项目

1)简单的RESTful应用程式3 java文件:

1.1)RestNotFoundExceptionHandler.java

package demo.app; 

import javax.ws.rs.NotFoundException; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.ext.ExceptionMapper; 
import javax.ws.rs.ext.Provider; 

@Provider 
public class RestNotFoundExceptionHandler implements ExceptionMapper<NotFoundException> { 
    @Override 
    public Response toResponse(NotFoundException e) { 
     return Response.ok().entity(e.toString() + "\n").type(MediaType.TEXT_PLAIN).build(); 
    } 
} 

1.2)AppRest.java

package demo.app; 

import javax.servlet.http.HttpServletRequest; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.MediaType; 

@Path("/") 
public class AppRest { 
    @GET 
    @Path("millis") 
    @Produces(MediaType.TEXT_PLAIN) 
    public String refresh(@Context HttpServletRequest request) { 
     try { 
      return Long.toString(System.currentTimeMillis()) + "\n"; 
     } catch (Exception e) { 
      return e.toString() + "\n"; 
     } 
    } 
} 

1.3)AppMain.java

package demo.app; 

import javax.ws.rs.NotFoundException; 
import org.jboss.resteasy.plugins.server.tjws.TJWSEmbeddedJaxrsServer; 

public class AppMain { 
    private static final int PORT = 8080; 

    public static void main(String[] args) { 
     AppRest appRest = new AppRest(); 
     TJWSEmbeddedJaxrsServer tjws = new TJWSEmbeddedJaxrsServer(); 
     tjws.setPort(PORT); 
     tjws.setRootResourcePath("/rest"); 
     tjws.start(); 
     tjws.getDeployment().getRegistry().addSingletonResource(appRest); 
     tjws.getDeployment().getProviderFactory().getExceptionMappers() 
       .put(NotFoundException.class, new RestNotFoundExceptionHandler()); 
    } 
} 

2)项目依赖,4个jar文件

jaxrs-api-3.0.9.Final.jar 
resteasy-jaxrs-3.0.9.Final.jar 
servlet-api-2.5.jar 
tjws-3.0.9.Final.jar 

3)卷曲测试用例:

3.1)正常情况下:

$ curl http://127.0.0.1:8080/rest/millis 
1419167594504 

3.2)RestNotFoundExceptionHandler情况:

$ curl http://127.0.0.1:8080/rest/bad 
javax.ws.rs.NotFoundException: Could not find resource for full path: http://127.0.0.1:8080/rest/bad