2016-02-05 21 views
7

在我的代碼,我將有很多幹將這樣一組相同的註解(一個用於Hibernate和他人傑克遜)的:將多個任意標註在一個

@Transient 
@JsonSerialize(using = LocalDateTimeSerializer.class) 
@JsonDeserialize(using = LocalDateTimeDeserializer.class) 
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = BaseEntity.JSON_DATETIME_FORMAT) 
public LocalDateTime getCreatedDateDT() { 
    return DateTimeUtils.klabTimestampToLocalDateTime(getCreatedDate(), createdDateDT); 
} 

我想盡量減少通過實現我自己的批註repetion,這將意味着所有這四個在一起,就像這樣:

@TransientLocalDateTime 
public LocalDateTime getCreatedDateDT() { 
    return DateTimeUtils.klabTimestampToLocalDateTime(getCreatedDate(), createdDateDT); 
} 

我該怎麼辦呢?這甚至有可能嗎?

UPDATE 感謝康斯坦丁Yovkov,現在我知道,我可以在一個組合所有傑克遜的註釋,但那是因爲傑克遜的註解處理器識別這樣的伎倆。我不知道是否有可能讓任何註釋處理器做到這一點?在我看來,它不是。

回答

6

傑克遜提供(用於註釋另一個註釋的註釋)一元註釋,稱爲@JacksonAnnotationsInside,這是一個:

元註釋(在其它註解用於註解)用於 指示,而不是使用目標註釋(帶註釋的註釋 ),Jackson應該使用它具有的元註釋 。

這可以通過使用 容器註釋來創建「組合註釋」,該註釋需要使用此註釋 以及其包含的所有註釋進行註釋。

所以,你應該建立這樣一個註解:

@Target(value = { ElementType.TYPE, ElementType.METHOD, 
        ElementType.PARAMETER, ElementType.FIELD }) 
@Retention(RetentionPolicy.RUNTIME) 
@JacksonAnnotationsInside // <-- this one is mandatory 
@Transient 
@JsonSerialize(using = LocalDateTimeSerializer.class) 
@JsonDeserialize(using = LocalDateTimeDeserializer.class) 
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = BaseEntity.JSON_DATETIME_FORMAT) 
public @interface TransientLocalDateTime {  
} 

和使用是這樣的:

@TransientLocalDateTime 
public LocalDateTime getCreatedDateDT() { 
    return DateTimeUtils.klabTimestampToLocalDateTime(getCreatedDate(), createdDateDT); 
} 
+0

這是有幫助的,但它可以被用於任意註釋或傑克遜的只有註釋?看起來'@瞬態'在這裏是不允許的。 –

+1

我可以用於任意註釋,但只能由Jackson註釋處理器處理......除非您編寫自定義註釋處理器,但是我相信您可以引入一個全新的註釋(而不是使用@JacksonAnnotationsInside' ),由註釋處理器處理。 –

+0

此外,我得到'@TransientLocalDateTime不適用於我的IDE中的方法錯誤。 –

相關問題