mike-neckのブログ

Java or Groovy or Swift or Golang

lombokで生成されたgetterにアノテーションを付与する方法と問題

lombokの既存バグにハマったので、その一時的な回避策のメモ。

なお、この情報は以下の環境でおこなった。

  • Java - 1.8.0_102
  • lombok - 1.16.12

なお、issueはこちら。

github.com


lombokで生成されるgetter(あるいはsetter)にアノテーションを付与する方法

GetteronMethod に特殊な記述法でついてほしいアノテーションを渡す。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Bool {
  @Getter(onMethod = @__({ @XmlAttribute }))
  private boolean value;
}

問題 - onMethod で渡すアノテーションにプロパティを設定するとコンパイルで落ちる

lombokのonXのドキュメントを読むかぎり、 onMethod に渡すアノテーションにプロパティが設定されていてもうまくコンパイルされるようである。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Int {
  @Getter(onMethod = @__({ @XmlAttribute(name = "int") }))
  private int value;
}

ところが、これをコンパイルすると次のようなエラーが発生してコンパイルが失敗する。

/path/to/project/src/main/java/foo/bar/Int.java:13: エラー: シンボルを見つけられません
    @Getter(onMethod = @__({ @XmlAttribute(name = "int") }))
                        ^
  シンボル:   クラス __
  場所: クラス Int
/path/to/project/src/main/java/foo/bar/Int.java:13: エラー: 注釈@<any?>に重複y?>'があります。
    @Getter(onMethod = @__({@XmlAttribute(name = "int")}))
                                          ^

回避策 - getterを手で書く

回避策がlombokを入れた意味があまりなくなってしまう方法で非常に残念である。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Int {
  private int value;
  @XmlAttribute(name = "int")
  public int getValue() {
    return value;
  }
}