ROJDAR 2024-05-07 17:46 采纳率: 28.6%
浏览 9

字段在数据库中明明是NULL,代码查询出来的对象字段也是NULL,但是返回给前端以后,字段值居然为0

最近发现一个很奇怪的问题,一直没搞清问题所在所以来请教一下大家,事情是这样的:

我在处理业务逻辑的时候发现某个字段在数据库中明明是NULL,代码查询出来的对象字段也是NULL,但是返回给前端以后,字段值居然为0,字段用的INTEGER包装类接收,以下是相关截图。

java代码查询出来为NULL,并且直接返回:

img

  _前端没做任何操作,仅仅是浏览器接收到请求后就发现null值变成了0_

img

请问原因是什么呢?应该怎么解决?

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-07 17:46
    关注

    引自免费微信小程序:皆我百晓生

    根据您的描述,这个问题可能出现在数据绑定或者序列化过程中。Java中的Integer类型在遇到null时会自动转换为0,这可能是导致前端接收到0而不是null的原因。为了解决这个问题,您可以尝试以下几个步骤:

    1. 检查数据绑定或序列化配置:确认您使用的JSON库(例如Jackson或Gson)是否启用了对null值的特殊处理。有些库默认将null转换为默认值,如0。确保这些设置正确。

    如果您使用的是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转换为默认值。

    1. 如果您使用了MyBatis作为ORM工具,确保映射文件中没有将null转换为特定值的注解。例如,在XML映射文件中,确保没有类似这样将null转换为0的设置:
    <result column="barnLength" property="barnLength" javaType="java.lang.Integer" typeHandler="org.apache.ibatis.type.IntegerTypeHandler"/>
    
    1. 如果您使用的是Spring Data JPA,确保实体类属性上的@Column注解没有指定nullable=false,这会导致null值被忽略并使用默认值填充。

    对于实体类的属性,确保它像这样定义:

    private Integer barnLength;
    

    而非

    @Column(nullable = false)
    private Integer barnLength;
    
    1. 在序列化前手动检查null值:在返回数据之前,您可以遍历对象并检查null值,将其替换为null字符串或其他合适的表示方法。这可以在服务层或控制器层完成。例如,使用Java Stream API:
    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的情况。如果问题依然存在,请提供更多的上下文信息,以便进一步分析。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月7日

悬赏问题

  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题