Lombok的lombok.copyableAnnotations无法与Jackson注释一起使用

时间:2019-06-13 00:53:24

标签: java jackson lombok

我正在尝试利用Lombok的新copyableAnnotations功能,以便将@JsonIgnore@JsonValue之类的Jackson注释复制到生成的getter / wither方法中。该博客似乎建议这样做:https://www.thecuriousdev.org/lombok-builder-with-jackson/。但是,当我尝试这样做时,我只会得到“错误:不适用于这种声明的注释类型”(指向我的value字段)。为什么这不起作用,我如何使其起作用?也许我误会了该功能的工作原理。我正在使用lombok 1.18.8。

model.java:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Value;

import javax.validation.constraints.NotNull;

@Value
public class BrandId implements ValueObject<Long> {

    @JsonCreator
    public static BrandId of(final Long value) {

        return new BrandId(value);
    }

    @NotNull
    @JsonValue
    private Long value;
}

lombok.config:

config.stopBubbling = true

lombok.copyableAnnotations += com.fasterxml.jackson.annotation.JsonIgnore
lombok.copyableAnnotations += com.fasterxml.jackson.annotation.JsonProperty
lombok.copyableAnnotations += com.fasterxml.jackson.annotation.JsonValue

1 个答案:

答案 0 :(得分:1)

  

为什么这不起作用[…]?

仅在方法声明和其他注释类型的声明上允许使用@JsonValue注释;因此,无论是否使用龙目岛,您都无法将其放在字段上。 (如果您查看its Javadoc,则会看到它带有@Target(value={ANNOTATION_TYPE,METHOD})的注释。)

好消息是@JsonValue仅适用于getter方法(不适用于setter方法,builder方法等),每个类只能有一个,因此手动进行并没有什么大不了的创建一个吸气剂:

    @NotNull
    private Long value;

    @JsonValue
    public Long getValue() {
        return value;
    }

如果您真的不喜欢它,则可以使用Lombok的实验性onMethod功能:

    @NotNull
    @Getter(onMethod=@__({@JsonValue}))
    private Long value;

与上述内容相同,只是处于实验阶段(因此在将来的Lombok和/或Java版本中可能会更改或消失)。