2010-05-20 33 views
11

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!"} 

Trả lời

9

Đối với những người có vấn đề tương tự trong tương lai ...

Hóa ra mã của tôi là OK cuối cùng. Tôi đã kéo tóc ra, vì vậy tôi viết lại mô-đun này, và vẫn không nhận được bất cứ nơi nào. Trình duyệt của tôi sẽ chỉ ngồi đó và treo mãi mãi. Tôi bắt đầu kiểm tra các tiêu đề với LiveHTTPHeaders (firefox add-on), và nhận thấy khi điều này xảy ra Content-Length lớn hơn 0. Sau đó tôi thử nghiệm với hurl.it và phát hiện ra cơ thể đã trở lại bình thường. Trình duyệt sẽ xử lý phản hồi XML tốt, nhưng sẽ không bao giờ hiển thị JSON (do đó treo). Điều này là tốt cho mục đích của tôi vì đây hoàn toàn là một API cho tiêu thụ ứng dụng và không cho người dùng. Có thông tin về ngoại lệ bản đồ tại 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)" 
} 
Các vấn đề liên quan