最近发现一个很奇怪的问题,一直没搞清问题所在所以来请教一下大家,事情是这样的:
我在处理业务逻辑的时候发现某个字段在数据库中明明是NULL,代码查询出来的对象字段也是NULL,但是返回给前端以后,字段值居然为0,字段用的INTEGER包装类接收,以下是相关截图。
java代码查询出来为NULL,并且直接返回:
_前端没做任何操作,仅仅是浏览器接收到请求后就发现null值变成了0:_
请问原因是什么呢?应该怎么解决?
最近发现一个很奇怪的问题,一直没搞清问题所在所以来请教一下大家,事情是这样的:
我在处理业务逻辑的时候发现某个字段在数据库中明明是NULL,代码查询出来的对象字段也是NULL,但是返回给前端以后,字段值居然为0,字段用的INTEGER包装类接收,以下是相关截图。
java代码查询出来为NULL,并且直接返回:
_前端没做任何操作,仅仅是浏览器接收到请求后就发现null值变成了0:_
请问原因是什么呢?应该怎么解决?
引自免费微信小程序:皆我百晓生
根据您的描述,这个问题可能出现在数据绑定或者序列化过程中。Java中的Integer类型在遇到null时会自动转换为0,这可能是导致前端接收到0而不是null的原因。为了解决这个问题,您可以尝试以下几个步骤:
如果您使用的是Spring Boot,可能需要调整ObjectMapper
的配置。添加以下配置到您的配置类中:
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, true)
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
}
这将阻止Jackson将null转换为默认值。
<result column="barnLength" property="barnLength" javaType="java.lang.Integer" typeHandler="org.apache.ibatis.type.IntegerTypeHandler"/>
@Column
注解没有指定nullable=false
,这会导致null值被忽略并使用默认值填充。对于实体类的属性,确保它像这样定义:
private Integer barnLength;
而非
@Column(nullable = false)
private Integer barnLength;
List<AGrainProtectionWorkBookVo> filteredList = list.stream()
.map(book -> {
AGrainProtectionWorkBookVo vo = new AGrainProtectionWorkBookVo();
vo.setId(book.getId());
// 其他属性...
if (book.getBarnLength() == null) {
vo.setBarnLength(null);
} else {
vo.setBarnLength(book.getBarnLength());
}
// ...其他属性
return vo;
})
.collect(Collectors.toList());
return getDataTable(filteredList);
按照以上建议排查并修改后,应该可以避免在前端接收到0而不是null的情况。如果问题依然存在,请提供更多的上下文信息,以便进一步分析。