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なしにする。
- https://fasterxml.github.io/jackson-databind/javadoc/2.13/com/fasterxml/jackson/databind/annotation/JsonDeserialize.html
- https://fasterxml.github.io/jackson-databind/javadoc/2.13/com/fasterxml/jackson/databind/annotation/JsonPOJOBuilder.html
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; }