当JAX-RS响应为404时的HTML响应

时间:2012-10-03 14:04:23

标签: tomcat http-status-code-404 jax-rs

我有一个JAX-RS资源类,可以在发出特定请求时返回404响应。不幸的是,即使操作的方法被注释@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }),404响应对象总是会导致Tomcat将自己的“未找到”HTML错误页面推入正文中。

这打破了期望XML / JSON响应的客户端。在这些情况下如何关闭Tomcat?

我的代码现在看起来像这样:

@GET
@Path("isbn/{isbn}")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response isbn(@PathParam("isbn") String isbn) {

    ProductSearchDO productSearch = ProductSvc.find( isbn );
    if (productSearch == null)
        return Responses.notFound().build();

    return Response.ok( productSearch ).tag( String.valueOf( productSearch.hashCode() ) ).build();
}

2 个答案:

答案 0 :(得分:2)

你不应该返回404.只需返回一个空的JSON,然后你的客户就可以处理它。

这种方法被称为“软404”(如果我没错的话)。

此方法也在Facebook中使用:

https://graph.facebook.com/search?q=nlknrekjfndjkfnsjkefbnejkrbfjedbfjekfbekj

修改

我会更好地解释它。因为W3C says应该使用404

  

服务器未找到与Request-URI匹配的任何内容。

实际上你的服务器找到了匹配的Request-URI,但响应只是空的。而且

  

当服务器不希望明确拒绝请求的原因时,或者当没有其他响应适用时,通常会使用此状态代码。

如果需要,您可以应用其他类型的回复。

如果您仍想按照自己的方式进行操作,可以尝试使用空白页覆盖标准Tomcat 404页面,或者要求客户端检查状态代码

if(statusCode==404) { blablabla }

<强> EDIT2:

为什么?我不认为我的答案是错的,你可以喜欢或不喜欢,但我认为这不是一个错误的答案。

在您的情况下,您正在为某种产品进行研究。如果您找不到符合搜索条件的产品,为什么要退回404?

有关此内容的更多消息来源:

Should a RESTful API return 404 for arrays of objects?

也在这里:

Querystring in REST Resource url

  

“如果网址返回搜索结果,则不应返回404。”

同样在这里:

REST: Mapping 404 HTTP Status codes 特别是评论:

  

简单地说,“无结果”是有效的搜索结果。资源存在,   它的表现形式简直就是“空洞”。所以,404是不合理的。

答案 1 :(得分:0)

404 Not Found是一个客户端错误,意味着客户端的问题是请求不存在的页面。在这种情况下,返回404是有意义的。

我认为客户端应该能够正确处理404响应。您作为服务器正在通过返回错误代码进行尽职调查。客户端能够处理响应。