JacksonとLombokの組み合わせ

JacksonとLombokの組み合わせについての備忘録。

ソースコード

plugins {
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = JavaVersion.VERSION_11

repositories {
    mavenCentral()
}

dependencies {
    annotationProcessor 'org.projectlombok:lombok:1.18.22'
    compileOnly 'org.projectlombok:lombok:1.18.22'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.1'
}

ObjectMapperでJSONの文字列をUserクラスにデシリアライズする。

public class Main {
    public static void main(String[] args) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        String json = "{\"id\":1,\"name\":\"name1\"}";
        User user = objectMapper.readValue(json, User.class);
        System.out.println(user);
    }
}

パターン

@Data

引数なしのデフォルトコンストラクタが生成されるので、デシリアライズできる。

import lombok.Data;

@Data
public class User {
    private long id;
    private String name;
}

@Data + @AllArgsConstructor + @NoArgsConstructor

@AllArgsConstructorを追加した場合はデフォルトコンストラクタが生成されないので、@NoArgsConstructorも追加する。

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private long id;
    private String name;
}

@Data + @AllArgsConstructor + @ConstructorProperties (lombok.config)

ConstructorPropertiesを使う場合は、lombok.configに設定を追加する。

lombok.anyConstructor.addConstructorProperties=true
import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class User {
    private long id;
    private String name;
}

@Value + @ConstructorProperties (lombok.config)

lombok.anyConstructor.addConstructorProperties=true
import lombok.Value;

@Value
public class User {
    long id;
    String name;
}

@Value + @ConstructorProperties

lombok.configを使わずに、明示的にConstructorPropertiesを設定したい場合。

import java.beans.ConstructorProperties;
import lombok.Value;

@Value
public class User {
    long id;
    String name;

    @ConstructorProperties({ "id", "name" })
    public User(long id, String name) {
        this.id = id;
        this.name = name;
    }
}

@Value + @JsonCreator

コンストラクタまたはファクトリーメソッドに@JsonCreatorを設定する。

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Value;

@Value
public class User {
    long id;
    String name;

    @JsonCreator
    public User(@JsonProperty("id") long id, @JsonProperty("name") String name) {
        this.id = id;
        this.name = name;
    }
}

@Value + @Builder + @JsonDeserialize + @JsonPOJOBuilder

@JsonPOJOBuilderのsetter名はデフォルトではwithから始まるので、Lombokのbuilderに合わせてprefixなしにする。

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import lombok.Builder;
import lombok.Value;

@Value
@Builder
@JsonDeserialize(builder = User.UserBuilder.class)
public class User {
    long id;
    String name;

    @JsonPOJOBuilder(withPrefix = "")
    public static class UserBuilder {
    }
}

@Value + @Builder + @Jacksonized

@Jacksonizedを使うと、上記と同じ設定をLombokが自動生成する。

import lombok.Builder;
import lombok.Value;
import lombok.extern.jackson.Jacksonized;

@Value
@Builder
@Jacksonized
public class User {
    long id;
    String name;
}

参考