2013-06-11 4 views
1

Есть ли способ указать @JsonTypeIdResolver в конфигурации mapper вместо аннотирования целевого класса? пример, вместо:Есть ли способ указать @JsonTypeIdResolver в конфигурации mapper вместо аннотации?

@JsonTypeInfo( 
    use = JsonTypeInfo.Id.CUSTOM, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "@type") 
@JsonTypeIdResolver(FooTypeIdResolver.class)   
public class Foo { 

} 

есть только

@JsonTypeInfo( 
    use = JsonTypeInfo.Id.CUSTOM, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "@type") 
public class Foo { 

} 

И сделать что-то вроде следующего на картографа

mapper.getSerializationConfig() 
.with(new JacksonAnnotationIntrospector()) 
.without(SerializationFeature.INDENT_OUTPUT); 
... 
// something like this : 
.addTypeIdResolver(Foo.class, FooTypeIdResolver.class) 

Я спрашиваю это потому, что FooTypeIdResolver на другой " библиотека ", которую библиотека Foo не может зависеть от ...

ответ

2

Вы можете использовать Джексон mix-in annotations, в вашем случае вы бы сначала создать класс с аннотациями, которые вы хотите добавить:

@JsonTypeIdResolver(FooTypeIdResolver.class) 
private static class FooMixIn { 

} 

И тогда вы бы применить эту смесь-в к классу Foo (грубо говоря, это требует аннотаций представить на FooMixIn и применяет их к Foo)

mapper.getSerializationConfig().addMixInAnnotations(Foo.class, FooMixIn.class); 
mapper.getDeserializationConfig().addMixInAnnotations(Foo.class, FooMixIn.class); 
1

Обработка всех аннотаций может быть изменено путем определения пользовательских AnnotationIntrospector: как правило, за счет расширения по умолчанию JacksonAnnotationIntrospector. Затем он может использовать любой альтернативный источник данных, который вы хотите.

Смешанные аннотации - это другой очевидный путь, как объясняется в принятом ответе.

+0

Спасибо за альтернативу – redben

Смежные вопросы