2016-01-05 21 views
6

REST api için global istisnaları yakalamak için jersey ve ExceptionMapper kullanıyorum. Uygulamamdaki tüm istisnalar iyi çalışıyor ancak jackson tarafından atılan istisnaları yakalayamıyorum. Örneğin, son noktamdan biri bir enum içeren bir nesneyi kabul eder. İstekte Json numaralandırma jarse olmayan bir değer varsa ben kod, bu mapper ulaşmak asla bu mapperJersey herhangi bir Jackson Özel Durumunu yakalayamıyor

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

oluşturduk rağmen bu istisna geri

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]->....) 

atmak.

Bu istisnaları yakalamak için yapmamız gereken bir şey var mı?

DÜZENLEME Not: Ben jus Ben mapper denir bu durumda InvalidFormatException kullanmak yerine JsonMappingException az genel çektim var. Ama hala anlamıyorum, çünkü InvalidFormatException JsonMappingException öğesini genişletiyor ve aynı şekilde çağrılmalıdır.

+1

Hangi versiyonda Jackson? –

+0

jersey-media-json-jackson (2.22.1), fakat ben de com.tr335.jpg.jackson.core jackson-annotations (2.6.3) de var. – Johny19

+2

Jackson zaten bu istisna için bir mapper'e sahip: (https: // github com/fasterXML/jackson-jaxrs-sağlayıcıları/damla/ana/baz/src/ana/java/com/fasterxml/jackson/jaxrs/baz/JsonMappingExceptionMapper.java). Muhtemelen kullanılmakta olan budur. –

cevap

3

Aynı sorunla karşılaştım.
Sorun şu ki, JsonMappingExceptionMapper eşleştiricinizden önce başladı.

gerçek istisna sınıfı com.fasterxml.jackson .databind.exc.InvalidFormatException ait olup mapper com.fasterxml.jackson .jaxrs.base.JsonMappingException tanımlar, bu nedenle istisna daha spesifik var .
Görüyorsunuz, Jersey'in istisna işleyicisi en doğru işleyiciyi bulmaya çalışıyor (org.glassfish.jersey.internal.ExceptionMapperFactory # find (java.lang.Class, T) 'ye bakın).

kullanılmasını basitçe devre dışı mapper Bu davranışı geçersiz kılmak için:

  1. XML kullanma: resourceConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true); ResourceConfig tipi org.glassfish.jersey taşımaktadır: kodu kullanarak <init-param> <param-name>jersey.config.server.disableAutoDiscovery</param-name> <param-value>true</param-value> </init-param>

  2. .server.ServerConfig.


Ayrıca kendi özgül eşleştiricisini yazabilirsiniz:

public class MyJsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException> 

Ama aşırı öldürmek olduğunu düşünüyorum.

+0

GEEEEEE TEŞEKKÜRLER! Beni çok uzun süren adam. Bir sonraki yoksul ruh için - sağlayıcıları kullanıyorsanız, keşfi tamamen devre dışı bırakmak zorunda değilsiniz, önceliği daha yüksek bir değere ayarlamak için bir Öncelikli ek açıklama kullanabilirsiniz. Tasarruf tarafında olmak için 1000'i seçtim, bu da Jackson'u arkaya soktu ve benimkini kullanıyor. – pandaadb

İlgili konular