Lombok 的 lombok.copyableAnnotations 不适用于 Jackson 注释

2023-11-20

我正在尝试利用 Lombok 的新功能copyableAnnotations功能以便拥有 Jackson 注释,例如@JsonIgnore and @JsonValue复制到生成的 getter/wither 方法。该博客似乎表明这应该可行:https://www.thecuriousdev.org/lombok-builder-with-jackson/。然而,当我尝试这个时,我只是得到“错误:注释类型不适用于这种声明”(指向我的value场地)。为什么这不起作用以及如何使其起作用?也许我误解了这个功能应该如何工作。我正在使用龙目岛 1.18.8。

模型.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;
}

龙目岛配置:

config.stopBubbling = true

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

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

The @JsonValue仅允许在方法声明和其他注释类型的声明上使用注释;所以,无论有没有 Lombok,你都不能把它放在一个字段上。 (如果你看它的Javadoc,你会看到它被注释为@Target(value={ANNOTATION_TYPE,METHOD}).)

好消息是@JsonValue仅适用于 getter 方法(不适用于 setter 方法、构建器方法等),并且每个类只能有一个 getter 方法,因此手动创建一个 getter 并不是什么大问题:

    @NotNull
    private Long value;

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

如果你真的不喜欢它,那么你可以使用 Lombok 的实验onMethod特征:

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

除了处于实验阶段之外,它与上面的内容等效(因此它可能会在 Lombok 和/或 Java 的未来版本中更改或消失)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lombok 的 lombok.copyableAnnotations 不适用于 Jackson 注释 的相关文章

随机推荐