2015-01-30 7 views
16

Chciałbym złapać wyjątek mapowania json w mojej restful usługi, w przypadku gdy wejście json nie jest prawidłowe.Jersey/Jackson: jak złapać wyjątek mapowania json?

Rzuca org.codehaus.jackson.map.JsonMappingException, ale nie wiem, jak i gdzie złapać ten wyjątek. Chcę złapać ten wyjątek i odesłać odpowiednią odpowiedź błędu.

@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(); 
    } 
} 

Wszystko działa poprawnie, ale jeśli ciało json nie jest dobrze uformowane następnie rzuca JsonMappingException wyjątek. Chcę złapać ten wyjątek.

+0

Patrz także: https://java.net/jira/browse/JERSEY-2722 –

Odpowiedz

17

Co ostatecznie pracował dla mnie było zadeklarować dostawcę ExceptionMapper dla JsonMappingException, takich jak

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

Podejście to wygląda dobrze, ale gdzie mogę rzucić i wychwycić ten wyjątek, aby móc wysłać odpowiednią odpowiedź w JsonMappingExceptionMapper. toResponse(). Zaimplementowałem JsonMappingExceptionMapper tak samo jak w przykładzie, ale nie wywoła ona metodyResponse, Wyrzuca JsonMappingException, ale nie jestem w stanie go przechwycić. Każdy pomysł gdzie i jak mogę złapać JsonMappingException? – Neel

+0

Tak, powinien zostać rzucony przez Jersey, jeśli ciało POST nie przekształca się w obiekt 'Customer'. Upewnij się, że zarejestrowałeś 'JsonMappingExceptionMapper' z aplikacją Jersey ... w moim przypadku rejestruję je poprzez integrację składnika Spring. –