2014-01-23 53 views
0

在我目前的項目中,我有這樣一組大的和複雜的註釋,我必須在我的課程周圍放置很多字段。他們是傑克遜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 { 
} 

所以我的問題是:它甚至有可能嗎?或者我只是做錯了什麼?

更新:我發現了particuliar傑克遜情況的解答,在這個線程 Create a custom Jackson annotation

,但我願意接受任何一般情況下的解決方案。

+0

發現傑克遜JSON的回答在這個線程http://stackoverflow.com/questions/12921812/create-a-custom-jackson-annotation ...但我很想在一個籠統的回答。 –

回答

1

與默認的傑克遜庫,你將沒有運氣。

下面的代碼片段從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並將其提供給SerializationConfigDeserializationConfig,例如,

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

好的。所以我的回答只是一個暗示,如果你不能使用另一個庫。 :) –