当前位置: 首页 > news >正文

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

先看歧义现象

值为null
在这里插入图片描述

在这里插入图片描述
未传递此属性
在这里插入图片描述
在这里插入图片描述
所以此时如何区分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 {@Overridepublic 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 {@Beanpublic 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());
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

http://www.lryc.cn/news/285090.html

相关文章:

  • 【深度学习每日小知识】NLP 自然语言处理
  • 一文理解Python选择语句
  • MyBatis XML 映射文件中的 SQL 语句可以分为动态语句和静态语句
  • Flask用于生产环境
  • 程序员如何向上管理,升职加薪
  • Microsoft Word 删除空行
  • 基于一次应用卡死问题所做的前端性能评估与优化尝试
  • JVM(上)
  • 【js】js 异步机制详解 Generator / Async / Promise
  • 【动态规划】【数学】【C++算法】805 数组的均值分割
  • Django笔记(五):模型models
  • 一个golang小白使用vscode搭建Ununtu20.04下的go开发环境
  • 【复现】Hytec Inter HWL 2511 SS路由器RCE漏洞_25
  • Kafka系列(四)
  • 【Linux学习】进程信号
  • 机器学习没那么难,Azure AutoML帮你简单3步实现自动化模型训练
  • 数学建模实战Matlab绘图
  • TypeError the JSON object must be str, bytes or bytearray, not ‘list‘
  • 数字IC后端设计实现 | PR工具中到底应该如何控制density和congestion?(ICC2Innovus)
  • 产品经理与产品运营的区别和联系
  • CMU15-445-Spring-2023-分布式DBMS初探(lec21-24)
  • Arch linux 安装
  • 最新ChatGPT/GPT4科研应用与AI绘图及论文高效写作
  • 【leetcode】移除元素
  • Spring Boot整合Redis的高效数据缓存实践
  • FastApi-参数接收的正确使用(2)
  • 三、需求规格说明书(软件工程示例)
  • Elasticsearch 查询语句概述
  • kafka简单介绍和代码示例
  • 一次解决ForkJoinPool日志追踪的辛酸经历