java - 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;
}
}
解决方案
找到了。通过使用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 {
}
}
推荐阅读
- r - R中长数据集中每个ID组的最后一行子集
- javascript - Chrome 扩展:在 URL 字符串匹配时取消隐藏弹出文本
- algorithm - 需要安排事件的顺序
- javascript - SAP Cloud SDK JavaScript:具有位置 ID 的 onPremise 目的地没有 CSRF 令牌
- r - 光栅中的反应式表达
- angular - 如何在 NativeScript 中对表单进行单元测试?
- laravel - 如何在循环中包含连接数据
- php - 将数据从表单发送到一页并转到另一页
- php - 在 Laravel 中存储从 OAuth 接收到的数组
- c# - 调用 HttpClient 并从分页请求中获得相同的结果 - 是我还是服务?