【问题标题】:Lombok's lombok.copyableAnnotations not working with Jackson annotationsLombok 的 lombok.copyableAnnotations 不适用于 Jackson 注释
【发布时间】:2019-06-13 00:53:24
【问题描述】:

我正在尝试利用 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

【问题讨论】:

    标签: java jackson lombok


    【解决方案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 的未来版本中更改或消失)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 2020-04-13
      • 2022-01-10
      • 2022-01-15
      • 1970-01-01
      相关资源
      最近更新 更多