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