将多个任意注释合并为一个

Mik*_*cer 7 java annotations hibernate jackson

在我的代码中,我将使用相同的注释集(有一个用于Hibernate,有些用于Jackson)有很多这样的getter:

@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);
}
Run Code Online (Sandbox Code Playgroud)

我希望通过实现我自己的注释来最小化重复,这将意味着所有这四个一起,如下所示:

@TransientLocalDateTime
public LocalDateTime getCreatedDateDT() {
    return DateTimeUtils.klabTimestampToLocalDateTime(getCreatedDate(), createdDateDT);
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做?这甚至可能吗?

更新 感谢Konstantin Yovkov,现在我知道,我可以将所有杰克逊注释合二为一,但这是因为杰克逊的注释处理器能够识别出这样的技巧.我想知道是否有可能让任何注释处理器这样做?在我看来,事实并非如此.

Kon*_*kov 7

杰克逊提供了一个元注释(用于注释另一个注释的注释),称为@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 {    
}
Run Code Online (Sandbox Code Playgroud)

并且使用就像:

@TransientLocalDateTime
public LocalDateTime getCreatedDateDT() {
    return DateTimeUtils.klabTimestampToLocalDateTime(getCreatedDate(), createdDateDT);
}
Run Code Online (Sandbox Code Playgroud)

  • 对于后一个错误,只需使用`@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.PARAMETER,ElementType.FIELD})`设置它,以便能够在每个可能的元素上使用它. (2认同)