泽西岛:通用捕获所有错误处理程序?

时间:2013-10-23 15:19:27

标签: java jersey

Jersey支持ExceptionMappers作为一般处理坏事的方法,但只有在调用到达我的代码时才有效。如果某人为该网址添加了boff,请说出http://host/fubar而不是http://host/foobar,那么它会返回一个通用的404.

我需要抓住那些boffed网址并重定向到我选择的网页,但几个小时后我似乎找不到合适的配置来实现这一目标。我一直在浏览调试器,但是我找不到我在某些配置中挂钩的地方,将这些404重定向到我选择的页面。

编辑:请注意,Jersey(1.17.1)会忽略任何WebApplicationException的自定义异常映射器。相反,它被路由到另一种处理方法。以下是Jersey的ContainerResponse.java的代码片段:

if (cause instanceof WebApplicationException) {
    mapWebApplicationException((WebApplicationException)cause);
} else if (!mapException(cause)) { ... }

mapWebApplicationException((WebApplicationException)cause)是Jersey自己的处理,因此它永远不会在调用自定义映射器的elseif中遇到mapException(cause)方法。

3 个答案:

答案 0 :(得分:3)

解决赏金问题:

  

这可能是泽西岛的一个错误,因为处理异常的可接受方式对WebApplicationException不起作用。我正在寻找一种解决方法,错误报告或在以后版本中修复的信息。

您可以创建捕获ExceptionMapperRuntimeException,然后测试该异常是否为WebApplicationException的实例:

@Provider
public class CustomExceptionMapper implements ExceptionMapper<RuntimeException> {

    @Override
    public Response toResponse(RuntimeException e) {

        if (e instanceof WebApplicationException) {
            return ((WebApplicationException) e).getResponse();
        }

        return Response.serverError().build();
    }
}

答案 1 :(得分:1)

创建customExceptionMapper应解决此问题。

@Provider
public class NotFoundMapper implements ExceptionMapper<NotFoundException>{

 public Response toResponse(NotFoundException exception){

    // do your custom processing here..
 }

}

答案 2 :(得分:1)

尝试使用jersey2.version = 2.19并且它的工作原理并不知道abt 1+版本

演示网址:https://jerseyexample-ravikant.rhcloud.com/rest/jws/getUserList/

您可以将其更改为任何其他内容,并将低于错误消息msg

    @Provider
public class EntityNotFoundException  extends WebApplicationException implements ExceptionMapper<NotFoundException>
{ 

    private static final long serialVersionUID = 7886520141629139380L;

    //@Override
    public Response toResponse(NotFoundException arg0) {

        StringBuilder response = new StringBuilder("<response>");
        response.append("<status>ERROR</status>");
        response.append("<message>The method you are looking for does not exist </message>");
        response.append("<time>" + new Date().toString() + "</time>");
        response.append("</response>"); 
        return Response.status(404).entity(response.toString()).type(MediaType.APPLICATION_XML).build();
    }


}