SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?

这篇具有很好参考价值的文章主要介绍了SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先看歧义现象

值为null
SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?,SpringMVC,SpringBoot,框架,spring boot,后端,java

SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?,SpringMVC,SpringBoot,框架,spring boot,后端,java
未传递此属性
SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?,SpringMVC,SpringBoot,框架,spring boot,后端,java
SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?,SpringMVC,SpringBoot,框架,spring boot,后端,java
所以此时如何区分null 时传递进来的的null,还是属性的默认值null?

引入方案

引入过滤器,中间截获requestBodyData并保存到HttpServletRequest,业务层从HttpServletRequest 获取到requestBodyData辅助判断此属性为未传递还是值为null

第1步:定义并注册过滤器

自定义过滤器截获requestBodyData并保存到HttpServletRequest

import com.practisesvr.utils.http.FilterHttpServletRequest;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.GenericFilterBean;

import java.io.IOException;

@Component
public class RequestCheckFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.err.println("***RequestHeaderCheckFilter.doFilter.start***");

        if (!(request instanceof HttpServletRequest)) {
            throw new IllegalStateException("Expected HttpServletRequest");
        }

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        FilterHttpServletRequest filterHttpRequest = new FilterHttpServletRequest(httpRequest);
        String body = filterHttpRequest.getBody();
        filterHttpRequest.setAttribute("requestBodyData", body);
        
        // 继续执行filter链
        chain.doFilter(filterHttpRequest, response);

        System.err.println("***RequestHeaderCheckFilter.doFilter.end***");
    }
}

[Ref: 过滤器使用到 HttpServletRequestWrapper 参考如下 ] What is HttpServletRequestWrapper does?

注册过滤器

@Configuration
public class AppConfig {
    @Bean
    public FilterRegistrationBean<RequestCheckFilter> requestCheckFilterRegistration() {
        FilterRegistrationBean<RequestCheckFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new RequestCheckFilter());
        // 可以设置过滤器名称
        registration.setName("requestCheckFilter");
        // 设置拦截规则
        registration.addUrlPatterns("/*"); // 拦截所有请求
        // 设置过滤器执行顺序,默认为0,数值越小优先级越高
        registration.setOrder(2);
        return registration;
    }
}

第2步:从HttpServletRequest 获取到requestBodyData

public class RequestIUtils {
    /**
     * 从当前请求上下文中获取并解析请求体数据,将其转换为Map类型对象.
     *
     * @return 如果成功获取到请求体数据并转换成功,则返回一个包含请求体内容的Map对象;
     * 若RequestAttributes不存在或请求体数据为空,则返回一个新的空HashMap对象。
     */
    public static Map<String, Object> getRequestBodyBody() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (requestAttributes == null) {
            return new HashMap<>();
        }
        HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();

        Object requestBody = request.getAttribute("requestBodyData");
        if (requestBody == null) {
            return new HashMap<>();
        }
        return JsonUtils.jsonToT(requestBody.toString(), Map.class);
    }
}    

第3步:业务层使用requestBodyData辅助判断

@Override
public Student update(Student student) {
    Map<String, Object> requestBody = RequestIUtils.getRequestBodyBody();
    
    Student stu = new Student();
    stu.setId(student.getId());
    stu.setUsername(student.getUsername());
    stu.setPassword(student.getPassword());
    stu.setAge(student.getAge());
    stu.setHeight(student.getHeight());
    stu.setGender(student.getGender());
    // 使用方式
    if (requestBody.containsKey("classId")){
        stu.setClassId(student.getClassId());
    }
    stu.setIsDelete(student.getIsDelete());
    
    this.studentsMapper.update(student);
    return this.queryById(student.getId());
}

SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?,SpringMVC,SpringBoot,框架,spring boot,后端,java

SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?,SpringMVC,SpringBoot,框架,spring boot,后端,java
SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?,SpringMVC,SpringBoot,框架,spring boot,后端,java

SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?,SpringMVC,SpringBoot,框架,spring boot,后端,java文章来源地址https://www.toymoban.com/news/detail-800929.html

到了这里,关于SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vuejs清空表单数据、删除对象中的空属性公共方法

    对于复杂数据,使用element自带的方法可能不能满足我们的需求,所以可以封装一个公共方法在全局。 一、清空表单数据: 二、删除对象中的空属性:

    2024年02月13日
    浏览(34)
  • SpringBoot如何让业务Bean优先于其他Bean加载

    本博客原文地址:https://ntopic.cn/p/2023090901/ 源代码先行: Gitee本文介绍的完整仓库:https://gitee.com/obullxl/ntopic-boot GitHub本文介绍的完整仓库:https://github.com/obullxl/ntopic-boot 今天走读一个应用程序代码,发现一个有趣的现象:有多个不同的业务Bean中均依赖了一个参数工具类Para

    2024年02月09日
    浏览(50)
  • 打包时,自动更新版本号,清空缓存

    1.创建 addVersion.js 文件 2.修改package.json 文件 serve 执行为测试用的,看版本是否生效 打包更新版本号,只需配置 build 相关指令即可 main.js 文件中添加 清除缓存功能 ok 完成以上执行 查看 package.json 中是否改变 ,结束

    2024年02月02日
    浏览(21)
  • java实体类属性值为null不返回或者某个属性不返回

    java实体类值为null或者无关紧要的属性,也返回给了前端,看起来不太高明。可以使用JsonInclude注解或者JsonField注解过滤掉。 用在实体类前或者属性前都可以。 用在属性前。 以上示例中,当total为null时不返回,适用于没有分页的情况。

    2024年02月12日
    浏览(33)
  • java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性

    目录 一、使用场景 二、环境准备 1、引入依赖 2、实体类 三、示例 1、不返回空值 (1)方式 (2)测试 (3)说明 2、不返回部分属性 (1)方式 (2)测试 四、 Jackson常用注解 1、 @JsonProperty 2、@JsonPropertyOrder 3、@JsonInclude 4、@JsonIgnoreProperties 5、@JsonFormat 6、@JsonUnwrapped         在开发过程

    2024年02月04日
    浏览(42)
  • Coalesce:处理Null值,返回传入的多个字段(属性)中第一个非空的值

    Coalesce函数是SQL中的一个函数,用于返回参数列表中第一个非空的表达式的值。Coalesce函数接受两个或多个参数,它会按顺序依次检查每个参数,返回第一个非空的参数值。如果所有参数都为空,则返回NULL。 Coalesce函数可以用于在SQL中处理空值的情况。在实际的数据处理中,

    2024年02月09日
    浏览(34)
  • MyBatis-plus更新对象时将字段值更新为null

            mybatis-plus在执行更新操作,当更新字段为 空字符串 或者 null 的则不会执行更新。如果要将指定字段更新null,可以通过以下三种方式实现。 1、全局配置         可以在 application.yml 配置文件中注入配置 GlobalConfiguration 属性 update-strategy, 将 update-strategy 策略调

    2024年02月15日
    浏览(41)
  • Mybatis-plus更新字段为null

    更新时,把某些字段的值更新为null,但是目前mybatis-plus的update/updateById会忽略实体类中为null的字段,导致这些字段没有更新还是原来的值。 网上比较常用的有两种: 缺点:当在其它接口更新别的字段时,本来没有想更新这个字段,但是也会把这个字段更新为null。 缺点:需

    2024年02月06日
    浏览(54)
  • Mybatis-plus怎么更新Null字段?

    本文介绍【Mybatis-plus】updateById()方法不能更新字段为null的原因及解决办法。 在日常项目开发过程中,经常会使用Mybatis-plus的updateById()方法,快速将接收道德参数或者查询结果中原本不为null的字段更新为null,并且该字段在数据库中可为null,这个时候使用updateById()并不能实现

    2024年02月13日
    浏览(43)
  • 跨应用连接同一个redis,从redis取缓存,对象属性值都为null

    ✅ 原因:idea本地代码实体类未进行代码混淆,docker代码实体类进行了混淆,导致对象存在,但是对象属性值为nul debug反序列化源码如下 读取到的字段为A,实体类中为具体的属性,不存在A,找到问题所在 ❓当时排查了如下几个方面 实体类是否进行序列化,序列化id是否指定

    2024年02月13日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包