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

11
在我的代码中,我将有很多像这样的getter方法,它们都有相同的一组注释(一个是为了Hibernate,另一个是为了Jackson)。

在我的代码中,我会有很多类似这样的getter方法,它们都有相同的一组注释(一个是用于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);
}

我希望通过实现自己的注释来最小化重复,这意味着所有这四个注释将一起使用,就像这样:

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

我该如何做?这真的可能吗?

更新 多亏了Konstantin Yovkov,现在我知道我可以将所有Jackson注释结合在一起,但这是因为Jackson的注释处理器识别出了这种技巧。我想知道是否可能让 任何 注释处理器都能做到这一点?但我觉得这是不可能的。

1个回答

10

Jackson提供了一种元注释(用于注释其他注释的注释),称为@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);
}

这很有帮助,但它能用于任意注释还是仅适用于Jackson的注释?似乎这里不允许使用@Transient - Mikhail Batcer
1
我可以用于任意注释,但只能由Jackson注释处理器处理...除非您编写自定义注释处理器,但是我相信您可以引入全新的注释(而不使用@JacksonAnnotationsInside),这些注释将由您的注释处理器处理。 - Konstantin Yovkov
此外,我在我的IDE中得到了“@TransientLocalDateTime不适用于方法”的错误。 - Mikhail Batcer
2
对于后面的错误,只需使用@Target(value = { ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD })进行设置,以便在每个可能的元素上使用它。 - Konstantin Yovkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接