Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jersey:一个通用的捕获所有错误的处理程序?_Java_Jersey - Fatal编程技术网

Java Jersey:一个通用的捕获所有错误的处理程序?

Java Jersey:一个通用的捕获所有错误的处理程序?,java,jersey,Java,Jersey,Jersey支持ExceptionAppers作为一种处理不好事情的方法,但这只有在调用到达我的代码时才起作用。如果有人盗用了URL,说http://host/fubar而不是http://host/foobar,然后返回一个通用404 我需要找到那些被篡改的URL并重定向到我选择的页面,但几个小时后,我似乎找不到正确的配置来实现这一点。我一直在浏览调试器,但我没有找到可以挂接某些配置以将此类404重定向到我选择的页面的位置 编辑:请注意,Jersey(1.17.1)会忽略任何WebApplic

Jersey支持ExceptionAppers作为一种处理不好事情的方法,但这只有在调用到达我的代码时才起作用。如果有人盗用了URL,说
http://host/fubar
而不是
http://host/foobar
,然后返回一个通用404

我需要找到那些被篡改的URL并重定向到我选择的页面,但几个小时后,我似乎找不到正确的配置来实现这一点。我一直在浏览调试器,但我没有找到可以挂接某些配置以将此类404重定向到我选择的页面的位置

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

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

mapWebApplicationException((WebApplicationException)原因)是Jersey自己处理的,因此它不会在调用自定义映射程序的elseif中命中mapException(原因)方法。

创建customExceptionMapper应能解决此问题

@Provider
public class NotFoundMapper implements ExceptionMapper<NotFoundException>{

 public Response toResponse(NotFoundException exception){

    // do your custom processing here..
 }

}
@Provider
公共类NotFoundMapper实现ExceptionMapper{
公共响应(NotFoundException){
//在这里进行定制处理。。
}
}
解决悬赏问题:

这可能是Jersey的一个bug,因为处理异常的公认方法不适用于
WebApplicationException
。我正在寻找一个变通方法,bug报告,或者在以后的版本中修复的信息

您可以创建一个捕获,然后测试异常是否为以下实例:

@Provider
公共类CustomExceptionMapper实现ExceptionMapper{
@凌驾
公共响应(运行时异常e){
if(WebApplicationException的实例){
返回((WebApplicationException)e).getResponse();
}
返回Response.serverError().build();
}
}

尝试使用jersey2.version=2.19,但效果良好不知道abt 1+版本

演示URL:

您可以将其更改为任何其他内容,并将在下面显示错误消息

    @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();
    }


}
@Provider
公共类EntityNotFoundException扩展WebApplicationException实现ExceptionApper
{ 
私有静态最终长serialVersionUID=7886520141629139380L;
//@凌驾
对响应的公共响应(NotFoundException arg0){
StringBuilder响应=新StringBuilder(“”);
响应。追加(“错误”);
append(“您正在寻找的方法不存在”);
append(“+newdate().toString()+”);
答复。追加(“”);
返回Response.status(404).entity(Response.toString()).type(MediaType.APPLICATION_XML).build();
}
}

很遗憾,没有。任何WebApplicationException都不会调用自定义映射器。ContainerResponse.MapPableContainerException,第398行(版本1.17.1),首先查找该案例并转移到它自己的处理程序。只有当它是其他类型的异常时,它才会查找映射的异常。这应该可以工作,我们会捕获所有类似的内容,并在有人抛出webapplication异常时记录严重错误。这仍然无法通过我提到的ContainerResponse.java代码。boffed URL永远不会到达我的异常映射程序,因为boffed URL是在ContainerResponse的第一个“if”子句中捕获的WebApplicationException,因此它永远不会到达调用我的自定义异常映射程序的第二个else-if块。我能想到的唯一解决方案是让每个命中我的服务器的请求公开一个/*REST端点,然后从那里进行内部路由,然后绕过jaxws提供的所有nice@PATH内容:(@ChrisKessel至少这样的行为在Jersey 2.x中已经修复。@CássioMazzochiMolin您使用的是什么版本的Jersey?他们是否修复了OP在该版本中提到的错误?@JonRomero我已经使用了许多版本的Jersey。我建议您尽可能使用最新的版本。当前的版本是2.25.x,我在answer在该版本中运行良好。
    @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();
    }


}