1. ホーム
  2. java

[解決済み] Lombokのlombok.copyableAnnotationsがJacksonアノテーションで機能しない件

2022-02-14 01:18:46

質問

ロンボク島で新しく導入された copyableAnnotations のようなジャクソンアノテーションを作成するための機能です。 @JsonIgnore@JsonValue をコピーして、生成されたgetter/witherメソッドにコピーしています。このブログでは、これでうまくいくはずだと示唆しているようだ。 https://www.thecuriousdev.org/lombok-builder-with-jackson/ . しかし、これを試すと、単に "error: annotation type not applicable to this kind of declaration" と表示されるだけです (私の 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

解決方法は?

<ブロッククオート

なぜ動かないのでしょうか?

@JsonValue アノテーションは、メソッド宣言と他のアノテーションタイプの宣言にのみ使用できます。したがって、Lombokの有無にかかわらず、このアノテーションをフィールドに付けることはできません。(もし、あなたが そのJavadoc でアノテーションされていることがわかる。 @Target(value={ANNOTATION_TYPE,METHOD}) .)

良い点としては @JsonValue はゲッターメソッドにのみ適用され (セッターメソッドやビルダーメソッドなどには適用されません)、クラスごとにひとつしか存在しないので、手動でひとつのゲッターを作成するだけなら大したことではありません。

    @NotNull
    private Long value;

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

もし、それがどうしても嫌なら、Lombokの実験的な onMethod という機能があります。

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

は、実験的であることを除けば上記と同等です (従って、LombokやJavaの将来のバージョンで変更されたり消滅したりする可能性があります)。