2016-01-05 15 views
6

Dla mojego REST API używam koszulki i ExceptionMapper, aby wychwycić wyjątki globalne. To działa dobrze wszystkie wyjątki, które moja aplikacja rzuca, ale nie jestem w stanie złapać wyjątku wyrzucony przez jackson.Jersey nie może złapać żadnego wyjątku Jacksona

Na przykład jeden z moich punktów końcowych akceptuje obiekt zawierający wyliczenie. Jeśli JSON we wniosku ma wartość, która nie jest w koszulce enum rzucać wyjątek ten tylną

Can not construct instance of my.package.MyEnum from String value 'HELLO': value not one of declared Enum instance names: [TEST, TEST2] 
at [Source: org.glassfish.jersey.me[email protected]5922e236; line: 3, column: 1] (through reference chain: java.util.HashSet[0]->....) 

Nawet Stworzyłem ten mapowania

@Provider 
@Component 
public class JacksonExceptionMapper implements ExceptionMapper<JsonMappingException> { 
    @Override 
    public Response toResponse(JsonMappingException e) { 
    .... 
    } 
} 

Kod nigdy nie dotrzeć do tego mapowania.

Czy jest coś, co musimy zrobić, aby uchwycić te wyjątki?

EDIT Uwaga: Mam jus próbował bycia mniej ogólne i zamiast JsonMappingException używam InvalidFormatException w tym przypadku element odwzorowujący nazywa. Ale nadal nie rozumiem, ponieważ wyjątek InvalidFormatException rozszerza JsonMappingException i powinien być również wywoływany

+1

Jaką wersję Jackson? –

+0

jersey-media-json-jackson (2.22.1) ale mam com.fasterxml.jackson.core jackson-adnotations (2.6.3) oraz – Johny19

+2

Jackson ma już [program do tego wyjątku] (https: // github .com/FasterXML/jackson-jaxrs-providers/blob/master/base/src/main/java/com/szybciejxml/jackson/jaxrs/base/JsonMappingExceptionMapper.java). To jest prawdopodobnie używane. –

Odpowiedz

3

Miał ten sam problem.
Problem polega na tym, że JsonMappingExceptionMapper uruchamia się przed programem odwzorowującym.

Rzeczywista wyjątek klasy com.fasterxml.jackson .databind.exc.InvalidFormatException i element odwzorowujący określa com.fasterxml.jackson .jaxrs.base.JsonMappingException, więc bardziej szczegółowy wyjątku .
Widzisz, program obsługi wyjątków Jersey szuka najdokładniejszego programu obsługi (zobacz org.glassfish.jersey.internal.ExceptionMapperFactory # find (java.lang.Class, T)).

Aby to zmienić, wystarczy wyłączyć mapowania przed użyciem:

  1. Korzystanie XML: <init-param> <param-name>jersey.config.server.disableAutoDiscovery</param-name> <param-value>true</param-value> </init-param>

  2. Korzystanie kod: resourceConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true); gdzie ResourceConfig jest typu org.glassfish.jersey .server.ServerConfig.


Można także napisać własną specyficzną mapowania:

public class MyJsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException> 

Ale myślę, że jest to kill skończona.

+0

GEEEEEE DZIĘKUJĘ! Człowieku, który zajął mi zbyt długo. Dla następnej biednej duszy - jeśli korzystasz z usług dostawców, nie musisz całkowicie wyłączać tego odkrycia, możesz użyć adnotacji priorytetowej, aby ustawić wyższy priorytet. Po prostu wybrałam 1000, aby być po stronie oszczędzania, która popycha jackson pod warunkiem, że jeden z tyłu i używa zamiast mnie. – pandaadb

Powiązane problemy