2014-01-23 2 views
0

В моем текущем проекте у меня есть эта группа больших и сложных аннотаций, которые я должен наложить на множество полей вокруг моего класса. Это аннотации Jackson json.Заменить сложную комбинацию аннотаций с одной пользовательской аннотацией

@JsonSerialize(using = IViewableToReferenceSerializer.class, contentUsing = IViewableToReferenceSerializer.class) 
private ComplexeObject myObject; 

, и я хотел бы заменить его на что-то вроде:

@JsonAsReference 
private ComplexeObject myObject; 

Я уже протестировали систему без аннотаций и она отлично работает. Я, хотя я мог бы определить свою аннотацию, как (например):

@Target({ElementType.METHOD, ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
@JsonSerialize(using = IViewableToReferenceSerializer.class, contentUsing = IViewableToReferenceSerializer.class) 
public @interface JsonAsReference { 
} 

Так что мой вопрос: Возможно ли это? Или я просто делаю что-то неправильно?

UPDATE: Я нашел ответ на particuliar Джексона случае в этой теме Create a custom Jackson annotation

, но я открыт для любого общего решения дела.

+0

нашел ответ для Jackson JSON в этой теме http://stackoverflow.com/questions/12921812/create-a-custom-jackson-annotation ... но я был бы заинтересован в общем ответ. –

ответ

1

С помощью стандартной библиотеки jackson вам не повезет.

Вот фрагмент кода из JacksonAnnotationIntrospector (с Джексоном 1.9.13)

public Object findSerializer(Annotated a) 
{ 
    /* 21-May-2009, tatu: Slight change; primary annotation is now 
    * @JsonSerialize; @JsonUseSerializer is deprecated 
    */ 
    JsonSerialize ann = a.getAnnotation(JsonSerialize.class); 
    if (ann != null) { 
     Class<? extends JsonSerializer<?>> serClass = ann.using(); 
     if (serClass != JsonSerializer.None.class) { 
      return serClass; 
     } 
    } 

    .... 
} 

Как вы можете видеть только аннотацию JsonSerialize будут приняты во внимание. Джексон не будет искать аннотацию JsonSerialize в другой аннотации, как вы хотели.

Вы можете реализовать собственный AnnotationIntrospector и предоставить его SerializationConfig и DeserializationConfig, например,

AnnotationIntrospector annIntr = ....; // your implementation 

ClassIntrospector<? extends BeanDescription> intr = new BasicClassIntrospector(); 
VisibilityChecker<?> vc = VisibilityChecker.Std.defaultInstance(); 
TypeFactory typeFactory= TypeFactory.defaultInstance(); 

SerializationConfig serConfig = new SerializationConfig(intr, annIntr, vc, null, 
      null, typeFactory, null); 
DeserializationConfig deserConfig = new DeserializationConfig(intr, annIntr, vc, null, 
      null, typeFactory, null); 

// null means use a default implementation 
ObjectMapper objectMapper = new ObjectMapper(null, null, null, serConfig, deserConfig); 
+0

благодарит Рене, но, как я уже говорил, о специфическом случае Джексона, я уже нашел решение ... это намного проще, чем ваш. Http: //stackoverflow.com/questions/12921812/create-a-custom-jackson-annotation –

+1

Да, хорошо. Поэтому мой ответ - это просто подсказка, если вы не можете использовать другую библиотеку. :) –

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