忽略网页.xml带有泽西岛异常映射器的错误页面

2022-09-04 22:54:36
@Provider
public class JerseyExceptionMapper implements ExceptionMapper<JerseyException> {


    @Override
    public Response toResponse(JerseyException jerseyException) {
        return Response.status(jerseyException.getErrorCode()).
                entity(jerseyException.getJsonResponseObj()).
                type(MediaType.APPLICATION_JSON).
                build();
    }

}

当您在 中使用中的组件时,上面的代码会产生不需要的结果。例如,如果 my 设置为 400,而我的组件将 400 定义为 400,则 Web 服务器会将请求重定向到 中定义的位置。<error-page>web.xmlResponse.statuserror-page<error-code>web.xml

这显然不是我想要的 REST 请求。我在StackOverflow上读到另一篇文章,说请求被转移到的原因是因为设置了。那篇帖子说,如果你设置了,将被忽略。error-pageHttpServletResponse.sendError(400)HttpServletResponse.setStatus(400)error-page

如果这是真的,我不明白它有什么帮助,因为我没有实现泽西岛代码。我看到的选项是调查 Response 类源代码,并可能重新实现状态方法或其他 Jersey 代码。这里有一个简单的选择还是我错过了什么?

从本质上讲,我的问题是:鉴于我正在使用泽西岛进行REST,并且我在我的中使用错误页面,我如何使用上述代码而忽略泽西岛代码?导致 HTTP 错误的任何其他代码都应转到 .或者是否有另一种不涉及但工作与我想要的相同解决方案?web.xmlerror-pageerror-pageerror-page


答案 1

我可以重现问题,但前提是我传递了 as 实体内容。null

例:

return Response.status(400)
        .entity(null)
        .type(MediaType.APPLICATION_JSON)
        .build();

甚至

return Response.status(400)
        .type(MediaType.APPLICATION_JSON)
        .build();

两者都将导致重定向到为 HTTP 状态代码 400 设置的错误页,因为如果未指定消息内容,容器将使用 sendError() 方法。

但是如果你这样做:

return Response.status(400)
        .entity("An error occured.")
        .type(MediaType.APPLICATION_JSON)
        .build();

或者这个:

return Response.status(400)
        .entity("")
        .type(MediaType.APPLICATION_JSON)
        .build();

容器/球衣将仅使用 setStatus() 方法,不会重定向到错误页面。如文档中所述:

此方法用于在没有错误时设置返回状态代码(例如,对于SC_OK或SC_MOVED_TEMPORARILY状态代码)。

如果使用此方法设置错误代码,则不会触发容器的错误页机制。如果存在错误,并且调用方希望调用 Web 应用程序中定义的错误页,则必须改用 sendError(int, java.lang.String)。

因此,在您的情况下,问题似乎是 返回 .您应该实现空值检查以避免这种情况。jerseyException.getJsonResponseObj()null

西岛1.x有一个错误JERSEY-1557描述了这个问题,它在没有修复的情况下被关闭,但建议使用空实体字符串作为解决方法。
泽西岛2.x也有一个类似的错误:泽西-2673

另请参阅:


答案 2

推荐