在一个

时间:2016-02-05 12:06:08

标签: java hibernate annotations 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);
}

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

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

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

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

1 个答案:

答案 0 :(得分:7)

Jackson提供了一个元注释(用于注释另一个注释的注释),名为@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);
}