Lombok的lombok.copyableAnnotations与Jackson注解不兼容。

5
我正在尝试使用Lombok的新功能copyableAnnotations,以便将Jackson注释,如@JsonIgnore@JsonValue复制到生成的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个回答

2
为什么这个不起作用[...]?
@JsonValue注释只允许在方法声明和其他注释类型的声明上使用;因此,无论是否使用Lombok,都不能将其放在字段上。(如果您查看它的Javadoc,您会看到它被标注为@Target(value = {ANNOTATION_TYPE,METHOD})。)
好消息是@JsonValue只适用于getter方法(而不是setter方法、构建器方法等),每个类只能有一个,因此手动创建那个getter并不是什么大问题:
    @NotNull
    private Long value;

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

如果你真的不喜欢那样做,那么你可以使用Lombok的实验性onMethod功能:
    @NotNull
    @Getter(onMethod=@__({@JsonValue}))
    private Long value;

这段话的意思是:“这与上面相同,只是它是实验性的(因此在未来版本的Lombok和/或Java中可能会更改或消失)。 ”

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