首页 > 解决方案 > Lombok @NonNull 空检查强制不适用于杰克逊反序列化

问题描述

我有一个简单的案例,在 Java8 中使用 Jackson(2.8)和 Lombok(最新版本)将 JSON 字符串转换为 POJO 时,我想对 JSON 字符串中的值强制执行空检查。但是当使用创建pojo时看起来@NonNull不会抛出异常ObjectMapper.convertValue,但是当使用构建器模式正常创建pojo时它工作正常”?

这是我的情况:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.Lombok;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.extern.log4j.Log4j2;

@Log4j2
public class LearnJackson {
  public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

  public static void main(final String[] args) throws IOException {
      learnToConvertJsonToSimplePojo();
  }

  public static void learnToConvertJsonToSimplePojo() throws IOException {
    String jsonString = "{}";
    JsonNode node = OBJECT_MAPPER.readValue(jsonString, JsonNode.class);

    // this is supposed to throw NullPointerException
    MySimplePojo o = OBJECT_MAPPER.convertValue(node, MySimplePojo.class);
    log.info("o.getVar1: {}, o.getVar2: {}", o.getVar1(), o.getVar2()); // prints null

    // MySimplePojo.builder().build(); // this throws NullPointerException correctly
  }


  @NoArgsConstructor
  @AllArgsConstructor
  @Builder
  @Data
  public static class MySimplePojo {
    @NonNull
    private String var1;
    @NonNull
    private List<String> var2;
  }

}

标签: javajsonjacksonlombok

解决方案


找到了。通过使用JsonDeserialize注释修复


  @NoArgsConstructor
  @AllArgsConstructor
  @Builder(builderClassName = "Builder", toBuilder = true)
  @Data
  @JsonDeserialize(builder = MySimplePojo.Builder.class)
  public static class MySimplePojo {
    @NonNull
    private String var1;
    @NonNull
    private List<String> var2;

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


推荐阅读