
在java中,基本数据类型(如boolean、int、double等)都有其默认值。例如,boolean的默认值是false,int的默认值是0。然而,它们的包装类型(如boolean、integer、double等)作为对象,其默认值是null。
当Jackson库进行JSON反序列化时,它会尝试将JSON数据映射到Java对象的字段。如果JSON中某个字段缺失,Jackson会根据Java字段的类型来处理:
这就是为什么当negate字段被定义为Boolean时,如果传入的JSON中不包含negate字段,它会被反序列化为null,从而在尝试访问negate时可能导致NullPointerException。
解决此问题的最直接和推荐的方法是将字段的类型从Boolean包装类型更改为boolean基本类型。
考虑以下原始类定义:
import lombok.AllArgsConstructor;
import lombok.Data;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List;
@Data
@AllArgsConstructor
@ApiModel
public class RelationEntityTypeFilter {
@ApiModelProperty(position = 1, value = "Type of the relation between root entity and other entity (e.g. 'Contains' or 'Manages').", example = "Contains")
private String relationType;
@ApiModelProperty(position = 2, value = "Array of entity types to filter the related entities (e.g. 'DEVICE', 'ASSET').")
private List<EntityType> entityTypes;
@ApiModelProperty(position = 3, value = "Negate relation type between root entity and other entity.")
private Boolean negate = false; // 问题所在:Boolean类型
}将negate字段的类型修改为boolean:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor; // 建议添加,如果需要无参构造函数进行反序列化
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List;
@Data
@NoArgsConstructor // 添加无参构造函数以支持Jackson反序列化
@AllArgsConstructor
@ApiModel
public class RelationEntityTypeFilter {
@ApiModelProperty(position = 1, value = "Type of the relation between root entity and other entity (e.g. 'Contains' or 'Manages').", example = "Contains")
private String relationType;
@ApiModelProperty(position = 2, value = "Array of entity types to filter the related entities (e.g. 'DEVICE', 'ASSET').")
private List<EntityType> entityTypes;
@ApiModelProperty(position = 3, value = "Negate relation type between root entity and other entity.")
private boolean negate; // 解决方案:改为boolean基本类型
// 注意:这里的 = false; 初始化不再必要,因为boolean默认就是false
}当negate字段变为boolean类型后,即使传入的JSON中不包含negate字段,Jackson在反序列化时也会将其默认设置为false,从而避免NullPointerException。
我们可以通过一个简单的Jackson反序列化示例来验证这一行为。
首先,定义一个简化版的类,只包含boolean类型的字段:
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
public class JacksonBooleanDefaultExample {
@NoArgsConstructor
@Getter
@Setter
@ToString
public static class SimpleFilter {
private boolean negate; // 使用boolean基本类型
}
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// 情况1:JSON中缺少negate字段
String negateIsMissingJson = "{ }";
SimpleFilter filter1 = mapper.readValue(negateIsMissingJson, SimpleFilter.class);
System.out.println("JSON缺失字段: " + filter1); // 预期输出: SimpleFilter(negate=false)
// 情况2:JSON中明确指定negate为false
String negateIsFalseJson = """
{
"negate" : false
}
""";
SimpleFilter filter2 = mapper.readValue(negateIsFalseJson, SimpleFilter.class);
System.out.println("JSON明确指定false: " + filter2); // 预期输出: SimpleFilter(negate=false)
// 情况3:JSON中明确指定negate为true
String negateIsTrueJson = """
{
"negate" : true
}
""";
SimpleFilter filter3 = mapper.readValue(negateIsTrueJson, SimpleFilter.class);
System.out.println("JSON明确指定true: " + filter3); // 预期输出: SimpleFilter(negate=true)
}
}运行上述代码,输出结果将是:
JSON缺失字段: SimpleFilter(negate=false) JSON明确指定false: SimpleFilter(negate=false) JSON明确指定true: SimpleFilter(negate=true)
从输出可以看出,当JSON中negate字段缺失时,boolean类型的negate字段被正确地反序列化为false。
在Java应用中,尤其是在使用Jackson进行JSON反序列化时,对于布尔型字段的选择至关重要。为了避免因JSON中字段缺失而导致的NullPointerException,并确保默认行为符合预期,强烈建议将简单的布尔标志定义为boolean基本类型,而非Boolean包装类型。这不仅能简化代码逻辑,还能提升程序的健壮性和性能。
以上就是解决Jackson中Lombok Boolean字段缺失时的默认值问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号