我的目标是在未找到对象时在 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!"}