2016-02-05 3 views
7

В моем коде, я буду иметь много добытчиков, как это с тем же набором аннотаций (один для Hibernate и других для Jackson):Объединение нескольких произвольных аннотаций в одном

@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 Благодаря Константину Йовкова, теперь я знаю, что я могу объединить все аннотации Джексона в одном, но это потому, что процессор аннотаций Джексона признает такой трюк. Интересно, можно ли сделать любым обработчиком аннотаций? Мне кажется, что это не так.

ответ

6

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

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

Это может быть полезно при создании «комбо-аннотаций» при наличии контейнера аннотации а, который должен быть аннотированным с этой аннотацией , а также все аннотациями он «содержит».

Таким образом, вы должны создать аннотацию, как этот:

@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

Это полезно, но оно может быть использовано для любых аннотаций или для Джексона только аннотации? Кажется, '@ Transient' здесь не допускается. –

+1

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

+0

Кроме того, я получаю '@TransientLocalDateTime неприменимо к ошибке метода в моей среде IDE. –

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