2015-01-30 13 views
16

Tôi muốn bắt ngoại lệ json ánh xạ trong dịch vụ an toàn của tôi trong trường hợp json đầu vào không hợp lệ.Jersey/Jackson: làm thế nào để bắt ngoại lệ lập bản đồ json?

Nó ném org.codehaus.jackson.map.JsonMappingException, nhưng tôi không biết cách hoặc nơi bắt ngoại lệ này. Tôi muốn bắt ngoại lệ này và gửi lại phản hồi lỗi thích hợp.

@JsonInclude(JsonInclude.Include.NON_NULL) 
@Generated("org.jsonschema2pojo") 
@JsonPropertyOrder({ 
     "name", 
     "id" 
}) 
public class Customer { 
    @JsonProperty("name") 
    private String name; 

    @JsonProperty("id") 
    private String id; 
    <setter/getter code> 
} 

public class MyService { 
    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    public final Response createCustomer(@Context HttpHeaders headers, 
      Customer customer) { 
     System.out.println("Customer data: " + customer.toString()); 
     return Response.ok("customer created").build(); 
    } 
} 

Mọi thứ hoạt động tốt, nhưng nếu thân hình json không được tạo hình tốt thì nó sẽ ném ra JsonMappingException ngoại lệ. Tôi muốn bắt ngoại lệ này.

+0

Xem thêm: https://java.net/jira/browse/JERSEY-2722 –

Trả lời

17

gì cuối cùng làm việc cho tôi là để tuyên bố một nhà cung cấp ExceptionMapper cho JsonMappingException, chẳng hạn như

import org.codehaus.jackson.map.JsonMappingException; 
import org.springframework.stereotype.Component; 

import javax.ws.rs.core.Response; 
import javax.ws.rs.ext.ExceptionMapper; 
import javax.ws.rs.ext.Provider; 

@Component 
@Provider 
public class JsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException> { 
    @Override 
    public Response toResponse(JsonMappingException exception) { 
     return Response.status(Response.Status.BAD_REQUEST).build(); 
    } 
} 
+0

Cách tiếp cận này có vẻ tốt, nhưng tôi có thể ném và bắt ngoại lệ này để tôi có thể gửi trả lời thích hợp trong JsonMappingExceptionMapper. để đáp ứng(). Tôi đã thực hiện JsonMappingExceptionMapper giống như trong ví dụ của bạn nhưng nó sẽ không gọi phương thức toResponse, Nó ném JsonMappingException nhưng tôi không thể bắt nó. Bất kỳ ý tưởng ở đâu và làm thế nào tôi có thể bắt JsonMappingException ?? – Neel

+0

Có, nó sẽ được ném bởi Jersey nếu cơ thể POST không deserialize vào đối tượng 'Customer'. Hãy chắc chắn rằng bạn đã đăng ký 'JsonMappingExceptionMapper' với ứng dụng Jersey ... trong trường hợp của tôi, tôi đăng ký chúng thông qua tích hợp thành phần Spring. –

Các vấn đề liên quan