SpringBoot返回结果为null或空值不显示处理方法(测试过多种场景)

本文介绍了在SpringBoot项目中遇到返回结果包含null或空值时,如何进行处理的多种尝试,包括更换查询模板、设置Mybatis配置、转换为JSON字符串等方法,并最终通过自定义消息转换器解决了问题。解决方案在于配置FastJsonConfig以保留空值,避免SpringBoot自动移除。

项目场景:

SpringBoot返回结果为null或空值不显示处理方法。


测试场景:

测试过的场景一:最开始是使用JdbcTemplate 查询数据返回,以为是JdbcTemplate 模板的问题,换成了Mybatis。


测试过的场景二:认为是Mybatis 配置 callSettersOnNulls = true 这个配置,就能成功返回。但是尝试了没有效果。


测试过的场景三:将List 转成 json 字符串,最后返回字符串能成功返回NULL值,但是这不符合要求。


测试过的场景四:对数据库的字段 作为空判断(IFNULL ()、NVL() )、取别名,测试过不行。


测试过的场景五: 也尝试了将返回的List集合转成JSONArray,然后通过对应的实体对象转成List 集合,虽然这种成功将数据库查出的NULL 的数据成功返回。但是会将key 键 自动转成小驼峰返回。不符合将数据库字段不变返回的效果。

public void test(){
		// dataList
	  JSONArray jsonArray = parseJSONArrayForListMap(dataList);
	  String s = jsonArray.toString();
	  List<BussCustomerInfoColBo> BussCustomerInfoColBos = fromListJson(s, BussCustomerInfoColBo.class);
}
    private static <T> List<T> fromListJson(String str,Class<T> clazz){
        return JSONArray.parseArray(str, clazz);
    }

    //判断当前字符串如果为空或者Null则返回字符串 空 ""
    private static Object isNullReturnEmpty(Object obj){
        if(null == obj || "".equals(obj) ){
            return "";//如果获取时间失败,则返回-
        }
        return obj;
    }
    /*
     * 将List<map>转换为JSONArray,将null替换为""
     */
    private static JSONArray parseJSONArrayForListMap(List<Map> listMap) {

        JSONArray array = new JSONArray();
        for(Map mmp : listMap) {
            JSONObject mmpJson = new JSONObject();

            Iterator iter = mmp.entrySet().iterator();
            while (iter.hasNext()) {
                Map.Entry entry = (Map.Entry) iter.next();
                Object key = entry.getKey();
                Object val = isNullReturnEmpty(entry.getValue());
                mmpJson.put(key+"", val);

            }
            array.add(mmpJson);
        }
        return array;
    }

测试过的场景六: 测试了这篇文章的转载了 。https://www.cnblogs.com/sunshinekevin/p/12110910.html 。
方法一:自定义消息转换器 (注意注释掉方法二的配置)。成功返回,符合要求。

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter{
    /**
     * 利用fastjson替换掉jackson
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters);
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
    }
}

最后:

首先要弄清楚问题出现的原因,最好将数据通过日志打印出来看下什么原因。我开始以为是从数据库查询工具jdbcTemplate 的原因,然后换成mybatis 结果还是一样的。这是什么原因呢?打印日志才发现是Spring Boot 的原因。从这个方向查找很多就找到解决方法。发现是SpringBoot返回的时候自动去掉了空值,需要配置消息转换器。
<think> 我们正在讨论Spring Boot实体类中进行null赋值的问题。根据用户提供的引用内容,虽然没有直接讨论实体类null赋值,但我们可以结合Spring Boot和实体类的一般使用场景来回答。 在Spring Boot中,实体类通常用于映射数据库表(如使用JPAMyBatis等持久层框架)。在实体类中进行null赋值,实际上就是给实体类的属性赋值为null。这本身是Java的基本操作,但需要注意以下几点: 1. **持久化框架的影响**:当我们将一个实体类的属性设置为null并保存到数据库时,持久层框架会根据映射配置将null值写入数据库。如果数据库字段允许为null,则可能抛异常。因此,需要确保实体类属性与数据库字段的约束一致。 2. **@Column注解**:在JPA中,我们可以使用`@Column(nullable = false)`来指定数据库字段允许为null。如果实体类属性为null,尝试保存时会抛异常。因此,在赋值null之前,需要确认数据库表允许该字段null。 3. **MyBatis-Plus等框架**:在MyBatis-Plus中,当我们使用实体类作为条件进行查询时,如果属性为null,通常会被忽略(即作为查询条件)。但有时候,我们可能需要将字符串转换为null,以避免字符串作为查询条件(如引用[4]所示)。所以,在实体类中设置null值可能会影响查询条件。 4. **自动填充字段**:有些字段(如创建时间、更新时间)可能由框架自动填充。如果这些字段被手动赋值为null,可能会覆盖框架的行为,导致错误。 5. **业务逻辑中的null处理**:在业务逻辑中,我们可能需要区分未设置的字段null)和空值(如字符串)。因此,在给实体类属性赋null值时,需要明确其业务含义。 6. **Jackson序列化**:如果实体类对象需要被序列化为JSON(如返回给前端),则null值会被序列化为null。可以使用`@JsonInclude(JsonInclude.Include.NON_NULL)`注解来避免序列化null值的属性。 **示例:** 假设有一个User实体类,我们想给email属性赋值为null: ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String email; // 如果数据库字段允许为null,则可以直接赋值为null // getters and setters } ``` 在业务代码中,我们可以这样赋值: ```java User user = new User(); user.setEmail(null); // 赋值为null ``` **注意事项:** - 确保数据库字段允许为null,否则会保存失败。 - 在查询时,如果使用该实体类作为条件,null属性通常会被忽略(作为查询条件)。如果需要查询字段null的记录,可以使用条件构造器(如MyBatis-Plus中的`QueryWrapper`)明确指定`isNull`条件。 - 避免在实体类中使用基本类型(如int),因为基本类型能为null,可以使用包装类型(如Integer)来表示可能为null的数值。 **相关问题:** §§相关问题§§ 1. 如何避免将实体类的null值保存到数据库现约束违反? 2. 在Spring Boot中,如何配置Jackson序列化实体类中的null值? 3. 使用MyBatis-Plus时,如何查询数据库字段null的记录? 4. 实体类中基本类型和包装类型在表示null时有什么区别? </think>在Spring Boot实体类中进行null赋值是常见的操作,但需要考虑持久化框架的行为和业务需求。以下是关键方法和注意事项: ### 一、基础赋值方法 ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String email; // 引用类型默认值为null // 显式赋null值 public void clearEmail() { this.email = null; // 直接赋值为null } } ``` ### 二、注意事项 1. **数据库约束冲突** 若数据库字段设置为`NOT NULL`,实体类赋null值保存时将抛`DataIntegrityViolationException` ▶ 解决方案: ```java @Column(nullable = true) // 明确允许null值 private String phone; ``` 2. **MyBatis-Plus查询陷阱** MyBatis-Plus默认忽略null条件(引用[4]): ```java // 查询条件会包含name字段 userService.lambdaQuery() .eq(User::getAge, 25) .eq(User::getName, null) // 被忽略! .list(); ``` ▶ 强制包含null条件: ```java .eq(User::getName, null).last("OR name IS NULL") ``` 3. **字符串与null的转换** 使用过滤器统一处理(引用[4]方案): ```java public class ParamsFilter implements Filter { @Override public void doFilter(ServletRequest request, ...) { Map<String, String[]> params = request.getParameterMap(); params.replaceAll((k,v) -> Arrays.stream(v).map(s -> s.isEmpty() ? null : s).toArray(String[]::new) ); // 字符串转null } } ``` 4. **Jackson序列化行为** null字段默认被序列化,可通过注解控制: ```java @JsonInclude(JsonInclude.Include.NON_NULL) // 序列化null字段 public class User { private String address; // null到JSON } ``` ### 三、推荐实践 1. **初始化明确赋值** ```java public User() { this.createTime = null; // 显式初始化 } ``` 2. **使用Optional避免NPE** ```java public Optional<String> getSafeEmail() { return Optional.ofNullable(email); } ``` 3. **更新策略选择** ```java // 使用@DynamicUpdate避免覆盖非字段 @Entity @DynamicUpdate public class Product { // 更新时只修改非null字段 } ``` ### 四、常见问题场景 1. **Session中null值丢失(引用[3])** HttpSession会丢失未显式存入的对象,确保通过`session.setAttribute()`存储 2. **依赖注入为null(引用[1][2])** 实体类本身应使用`@Autowired`,需通过Repository操作
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值