Mục tiêu của tôi là có một lỗi đậu được trả lại trên 404 với thông báo mô tả khi không tìm thấy đối tượng và trả về cùng loại MIME được yêu cầu.Trả lại JSON hoặc XML cho Ngoại lệ trong Jersey
Tôi có tài nguyên tra cứu, sẽ trả về đối tượng được chỉ định trong XML hoặc JSON dựa trên URI (Tôi đã thiết lập tham số com.sun.jersey.config.property.resourceConfigClass servlet vì vậy tôi không cần tiêu đề Chấp nhận JAXBContextResolver của tôi có lớp ErrorBean.class trong danh sách các kiểu của nó và JAXBContext đúng được trả về cho lớp này vì tôi có thể thấy trong các bản ghi).
ví dụ: 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");
}
}
Và NotFoundException của tôi trông như thế này:
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());
}
}
Các ErrorBean được như sau:
@XmlRootElement(name = "error")
public class ErrorBean {
private String errorMsg;
private int errorCode;
//no-arg constructor, property constructor, getter and setters
...
}
Tuy nhiên, tôi luôn nhận được một 204 Không có nội dung phản hồi khi tôi thử điều này. Tôi đã hack xung quanh và nếu tôi trả về một chuỗi và chỉ định loại mime hoạt động tốt:
public NotFoundException(String message) {
super(Response.status(Response.Status.NOT_FOUND).
entity(message).type("text/plain").build());
}
Tôi cũng đã thử trả về ErrorBean làm tài nguyên. Đây hoạt động tốt:
{"errorCode":404,"errorMsg":"Location 1 is not found!"}