先看歧義現(xiàn)象
值為null
未傳遞此屬性
所以此時(shí)如何區(qū)分null 時(shí)傳遞進(jìn)來的的null,還是屬性的默認(rèn)值null?
引入方案
引入過濾器,中間截獲requestBodyData
并保存到HttpServletRequest
,業(yè)務(wù)層從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);
// 繼續(xù)執(zhí)行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());
// 可以設(shè)置過濾器名稱
registration.setName("requestCheckFilter");
// 設(shè)置攔截規(guī)則
registration.addUrlPatterns("/*"); // 攔截所有請求
// 設(shè)置過濾器執(zhí)行順序,默認(rèn)為0,數(shù)值越小優(yōu)先級越高
registration.setOrder(2);
return registration;
}
}
第2步:從HttpServletRequest 獲取到requestBodyData
public class RequestIUtils {
/**
* 從當(dāng)前請求上下文中獲取并解析請求體數(shù)據(jù),將其轉(zhuǎn)換為Map類型對象.
*
* @return 如果成功獲取到請求體數(shù)據(jù)并轉(zhuǎn)換成功,則返回一個(gè)包含請求體內(nèi)容的Map對象;
* 若RequestAttributes不存在或請求體數(shù)據(jù)為空,則返回一個(gè)新的空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步:業(yè)務(wù)層使用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.zghlxwxcb.cn/news/detail-800929.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-800929.html
到了這里,關(guān)于SpringBoot 更新業(yè)務(wù)場景下,如何區(qū)分null是清空屬性值 還是null為vo屬性默認(rèn)值?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!