Lombok's lombok.copyableAnnotations не работает с аннотациями Джексона - PullRequest
1 голос
/ 13 июня 2019

Я пытаюсь использовать новую функцию copyableAnnotations в Lombok, чтобы аннотации Джексона, такие как @JsonIgnore и @JsonValue, копировались в сгенерированные методы получения / увядания.Кажется, этот блог предлагает, чтобы это работало: 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 Ответ

1 голос
/ 19 июля 2019

Почему это не работает […]?

Аннотация @JsonValue разрешена только в объявлениях методов и в объявлениях других типов аннотаций;поэтому, с Ломбоком или без него, вы не можете поставить его на поле.(Если вы посмотрите на его Javadoc , вы увидите, что он помечен @Target(value={ANNOTATION_TYPE,METHOD}).)

Хорошая новость заключается в том, что @JsonValue применяется только к методам получения (не к методам установки)., методы построения и т. д.), и может быть только один из них на класс, так что нет ничего сложного в том, чтобы просто вручную создать этот один метод получения:

    @NotNull
    private Long value;

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

Если вам действительно это не нравится, тогда выможет использовать экспериментальную функцию onMethod Lombok:

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

, которая эквивалентна вышеупомянутой, за исключением экспериментальной (поэтому она может измениться или исчезнуть в будущих версиях Lombok и / или Java).

...