11

我的目标是在未找到对象时在 404 上返回带有描述性消息的错误 bean,并返回所请求的相同 MIME 类型。

我有一个查找资源,它将根据 URI 返回 XML 或 JSON 中的指定对象(我已经设置了 com.sun.jersey.config.property.resourceConfigClass servlet 参数,所以我不需要 Accept 标头。我的 JAXBContextResolver 有ErrorBean.class 在其类型列表中,并为此类返回正确的 JAXBContext,因为我可以在日志中看到)。

例如:http ://foobar.com/rest/locations/1.json

@GET
@Path("{id}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Location getCustomer(@PathParam("id") int cId) {
   //look up location from datastore
    ....
    if (location == null) {
        throw new NotFoundException("Location" + cId + " is not found");
     }

}

我的 NotFoundException 看起来像这样:

public class NotFoundException extends WebApplicationException {

    public NotFoundException(String message) {
        super(Response.status(Response.Status.NOT_FOUND).
                entity(new 
                        ErrorBean(
                           message, 
                           Response.Status.NOT_FOUND.getStatusCode()
                        )
                .build());
    }

}

ErrorBean 如下:

@XmlRootElement(name = "error")
public class ErrorBean {

    private String errorMsg;
    private int errorCode;

        //no-arg constructor, property constructor, getter and setters
        ...

}

但是,当我尝试此操作时,我总是收到204 No Content响应。我已经破解了,如果我返回一个字符串并指定 mime 类型,这可以正常工作:

public NotFoundException(String message) {
    super(Response.status(Response.Status.NOT_FOUND).
            entity(message).type("text/plain").build());
}

我也尝试过将 ErrorBean 作为资源返回。这工作正常:

{"errorCode":404,"errorMsg":"Location 1 is not found!"}
4

1 回答 1

9

对于那些将来有类似问题的人......

结果我的代码最后没问题。我正在拔头发,所以我重写了这个模块,但仍然没有得到任何结果。我的浏览器只会坐在那里永远挂起。我开始使用 LiveHTTPHeaders(firefox 插件)检查标头,并注意到发生这种情况时 Content-Length 大于零。然后我用hurl.it进行了测试,发现身体恢复正常。浏览器可以很好地处理 XML 响应,但永远不会显示 JSON(因此挂起)。这对我的目的来说很好,因为这纯粹是一个用于应用程序消费而不是用户的 API。Jersey wiki上有关于映射异常的信息。

HTTP/1.1 404 Not Found
Content-Type: application/json
Date: Fri, 21 May 2010 06:39:28 GMT
Server: Google Frontend
Cache-Control: private, x-gzip-ok=""
Transfer-Encoding: chunked

{
    "errorCode": "404", 
    "errorMsg": "Could not retrieve entity of kind Location with key Location(10)"
}
于 2010-05-21T06:49:11.133 回答