JSON から Lombok @Builder POJO を生成する

Lombok の @Data と @Builder を組み合わせて、フルエントなビルダー API を持つ Java POJO を生成します。任意フィールドが多い DTO に有効です。

Annotations

詳細な説明

Lombok でビルダーパターン

引数の多いコンストラクタはあっという間に読みにくくなります。Lombok の @Builder はフルエントなビルダーを生成し、フィールド単位で名前付き引数のように構築できるようにします。

JSON の例

{
  "id": 100,
  "title": "Inbox Zero",
  "description": "Reach inbox zero by Friday.",
  "priority": "high",
  "completed": false
}

@Data + @Builder の Java

ツールで Lombok @Data を有効にして生成した後、@Builder を手動で追加します。

package com.example.model;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class Task {
    private Integer id;
    private String title;
    private String description;
    private String priority;
    private Boolean completed;
}

ビルダーの使い方

Task task = Task.builder()
    .id(100)
    .title("Inbox Zero")
    .description("Reach inbox zero by Friday.")
    .priority("high")
    .completed(false)
    .build();

入れ子コンストラクタを置き換える理由

5 つの引数を持つコンストラクタは呼び出し側で読みにくいです。

new Task(100, "Inbox Zero", "Reach inbox zero by Friday.", "high", false);

ビルダーは自己説明的です。

Task.builder()
    .title("Inbox Zero")
    .priority("high")
    .build();

フィールドを省略でき、引数順序にも依存しません — どちらも可読性とリファクタリング安全性に大きく貢献します。

デフォルト値は @Builder.Default

null 以外のデフォルト値が欲しいフィールドには @Builder.Default を付けます。

@Builder.Default
private Boolean completed = false;

record とビルダー

record は不変かつ正規コンストラクタが固定されているため Lombok @Builder を使えません。record でビルダーが欲しい場合は静的 builder() メソッドを手書きするか、RecordBuilder のようなコード生成ツールを利用します。

デシリアライズに使うビルダー

ビルダーに @JsonDeserialize(builder = Task.TaskBuilder.class)@JsonPOJOBuilder(withPrefix = "") を付けると、Jackson は直接ビルダー経由でデシリアライズできます。任意フィールドが多い不変オブジェクトに特に有効です。

ユースケース

フォーム送信 DTO、検索クエリビルダー、任意フィールドが多い設定オブジェクトはビルダー API でぐっと扱いやすくなります。テストフィクスチャも Order.builder().status("pending").build() のように読みやすくなります。

試してみる — JSON to Java

フルツールを開く