【Java基础系列】body参数前后端不一致
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ?? 欢迎订阅本专栏 ??
博客目录
一.现象复原
1.还原现场
post 请求参数 detail 里有 15 条 断点看就只有 7 条了 丢了中间的 6-14 条数据 有什么好的排查方案吗
2.debug 截图
debug 截图只有 7 条
3.Post 请求参数
post 请求的实际参数有 15 条
二.排查过程
1.可能得情况
- @InitBinder 注解,
- 有没有 HttpServletRequestWrapper 拦截器以及相关的子类,
- Filter 以及相关的子类,
- WebMvcConfigurer 以及相关的子类,
- HandlerInterceptorAdapter 以及相关的子类
2.字段解析错误
排除这个错误,如果是字段解析错误的直接会报错,因为请求的参数多,和实体类不匹配会直接报错,所以这种情况可以直接排除掉。
3.@InitBinder 注解
@InitBinder
是 Spring MVC 提供的一个注解,它用于自定义数据绑定的一些规则或配置。通常,它用于注册一些自定义的编辑器(Editor)或验证器(Validator),以便在控制器中对请求参数进行预处理。
以下是 @InitBinder
注解的一些中文详解:
-
作用:
@InitBinder
注解主要用于初始化 Web 数据绑定器,可以在控制器中对数据绑定进行自定义配置。 -
位置: 通常,
@InitBinder
注解标注在一个控制器类的方法上,这个方法可以有任意的名称。在这个方法中,你可以注册一些自定义的编辑器或验证器。 -
方法签名: 注解的方法需要返回
void
,而且需要接受一个WebDataBinder
类型的参数。@InitBinder public void initBinder(WebDataBinder binder) { // 在这里进行数据绑定的初始化配置 }
-
WebDataBinder 参数:
WebDataBinder
是 Spring MVC 中用于进行数据绑定的核心类,它包含了与数据绑定相关的各种方法和配置。 -
数据编辑器(Editor)的注册: 你可以使用
binder.registerCustomEditor
方法注册自定义的编辑器,用于将字符串转换为特定类型的数据。例如,将字符串转换为日期类型。@InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false)); }
-
验证器(Validator)的注册: 通过
binder.addValidators
方法注册自定义的验证器,用于在数据绑定之前对数据进行验证。@InitBinder public void initBinder(WebDataBinder binder) { binder.addValidators(new MyCustomValidator()); }
-
数据预处理: 在
@InitBinder
方法中,你还可以进行一些其他的数据预处理操作,例如将字符串中的空格去除,或者将特定格式的数据进行处理。@InitBinder public void initBinder(WebDataBinder binder) { // 进行一些数据预处理的操作 }
总体而言,@InitBinder
提供了一种灵活的机制,使得你可以在控制器中对数据绑定的行为进行个性化定制。这对于处理一些特殊的数据转换或验证需求非常有用。
4.HttpServletRequestWrapper 拦截器
HttpServletRequestWrapper
是一个用于包装 HttpServletRequest
的类,它允许你在处理请求时对原始的 HttpServletRequest
进行一些修改或增强。这通常在 Servlet 过滤器或拦截器中使用,用于对请求进行预处理或者修改请求参数等操作。
下面是一个简单的实例,演示了如何使用 HttpServletRequestWrapper
进行拦截器的请求修改:
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
@WebFilter("/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 将 ServletRequest 转换为 HttpServletRequest
HttpServletRequest httpRequest = (HttpServletRequest) request;
// 使用 HttpServletRequestWrapper 进行包装
MyHttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper(httpRequest);
// 继续执行过滤器链
chain.doFilter(requestWrapper, response);
}
@Override
public void destroy() {
// 销毁操作
}
}
然后,定义 MyHttpServletRequestWrapper
类,继承自 HttpServletRequestWrapper
:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
public MyHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
// 在这里可以对请求参数进行修改或增强
String value = super.getParameter(name);
// 示例:将参数值转为大写
return (value != null) ? value.toUpperCase() : null;
}
// 如果需要对其他方法进行修改,可以覆盖相应的方法
}
在上述例子中,MyHttpServletRequestWrapper
重写了 getParameter
方法,在获取请求参数时将参数值转换为大写。你可以根据需要在 MyHttpServletRequestWrapper
中覆盖其他方法,以完成各种对请求的修改或增强操作。
注意:使用 HttpServletRequestWrapper
需要谨慎,确保你了解自己的需求和对请求的修改操作,以避免潜在的问题。
觉得有用的话点个赞
👍🏻
呗。
??????本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!