我编写了一些异常映射器来捕获和处理内置的休息容易异常,如NotFoundException,MethodNotAllowedException等,示例代码如下所示:
@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();
}
}
我还在我的web过滤器类中编写了一个try catch块。每当发生NotFoundException时,它都不会被映射器捕获,而是会进入Filter中的catch块。
然而,我尝试了另一个异常映射器类来处理JsonParsingException。这种方法正常工作,只要发生Json Parse异常,就会从映射器给出正确的响应。
问题仅在于重复例外情况。 此外,Provider已使用组件扫描中的include-filter标记在应用程序上下文中注册。
请指导我在mapper类本身中捕获简单的内置异常需要做些什么。
此致 RM
答案 0 :(得分:2)
我遇到了同样的问题。使用@Component注释NotFoundExceptionMapper应该修复它(或将NotFoundExceptionMapper作为bean添加到应用程序上下文(xml文件))。
当您的Spring上下文启动时,应该注册NotFoundExceptionMapper(您应该在日志记录中使用“在...中预先实例化单例”)
答案 1 :(得分:2)
这是我的演示项目
1)一个包含3个java文件的简单RESTful应用程序:
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 case:
$ 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
答案 2 :(得分:0)
我尝试了同样的事情,并在尝试映射UnsupportedMediaTypeException时遇到了麻烦。
根据http://docs.jboss.org/resteasy/docs/1.1.GA/userguide/html/ExceptionHandling.html和Exception Mappers部分下的第一行,您似乎只能映射应用程序例外。