Spring 编程常见错误 50 例
傅健
Cisco 高级软件工程师、Netty 源码贡献者
17065 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
结束语 (1讲)
期末测试 (1讲)
Spring 编程常见错误 50 例
15
15
1.0x
00:00/00:00
登录|注册

12|Spring Web 参数验证常见错误

你好,我是傅健,这节课我们来聊聊 Spring Web 开发中的参数检验(Validation)。
参数检验是我们在 Web 编程时经常使用的技术之一,它帮助我们完成请求的合法性校验,可以有效拦截无效请求,从而达到节省系统资源、保护系统的目的。
相比较其他 Spring 技术,Spring 提供的参数检验功能具有独立性强、使用难度不高的特点。但是在实践中,我们仍然会犯一些常见的错误,这些错误虽然不会导致致命的后果,但是会影响我们的使用体验,例如非法操作要在业务处理时才被拒绝且返回的响应码不够清晰友好。而且这些错误不经测试很难发现,接下来我们就具体分析下这些常见错误案例及背后的原理。

案例 1:对象参数校验失效

在构建 Web 服务时,我们一般都会对一个 HTTP 请求的 Body 内容进行校验,例如我们来看这样一个案例及对应代码。
当开发一个学籍管理系统时,我们会提供了一个 API 接口去添加学生的相关信息,其对象定义参考下面的代码:
import lombok.Data;
import javax.validation.constraints.Size;
@Data
public class Student {
@Size(max = 10)
private String name;
private short age;
}
这里我们使用了 @Size(max = 10) 给学生的姓名做了约束(最大为 10 字节),以拦截姓名过长、不符合“常情”的学生信息的添加。
定义完对象后,我们再定义一个 Controller 去使用它,使用方法如下:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Spring Web参数验证常见错误 本文深入探讨了在Spring Web开发中常见的参数验证错误,并提供了详细的案例分析和解决方法。首先介绍了参数验证在Web编程中的重要性以及Spring提供的参数验证功能的特点。随后,通过两个案例分析了常见的参数验证错误及其原因。第一个案例涉及对象参数校验失效,通过源码剖析找到了问题的根源,并提出了解决方案。第二个案例涉及嵌套校验失效,作者指出了对嵌套对象的校验容易被忽略,并给出了相应的示例和问题原因。 文章还强调了修正参数验证错误的重要性,以及在实践中可能存在的误解和困惑。作者通过源码级别的解读,深入剖析了参数验证的执行过程,为读者提供了更深入的理解和解决问题的思路。最后,文章提出了一个思考题,引导读者进一步思考和探讨相关技术问题。 总的来说,本文通过具体的案例分析,深入浅出地介绍了Spring Web开发中常见的参数验证错误及其解决方法,对于正在进行Spring Web开发的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Spring 编程常见错误 50 例》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • 安迪密恩
    案例一有个天坑。 引入 spring-boot-starter-validation , 没毛病。 但是如果同时引入了 javax.validation - validation-api 。 校验会失效。
    2022-03-10
    6
  • bigben
    如果是List<Phone>怎么加@Valid
    2022-05-18
    1
    3
  • 小飞同学
    思考题:解析器是ServletRequestMethodArgumentResolver,验证后发现校验并没有生效。因为里面没有相关的校验方法,需要在类上面增加@Validated才能做一个增强 另外问一个小问题:老师怎么通过注解找到相关的实现类的,非常好奇。@Size 找到 SizeValidatorForCharSequence#isValid
    2021-05-19
    2
    3
  • 慎独明强
    今天讲的两个案例亲身经历过,特别是级联检验时,因为没有加注解导致未检验。面向百度开发去了,汗颜 没有去面向源码深入研究为什么需要加注解才能级联检验
    2021-05-31
    2
  • 路在哪
    思考题:负责解析Id的参数解析器是:PathVariableMethodArgumentResolver,然后校验参数的解析器是:ServletRequestMethodArgumentResolver,该解析器在DispatcherServlet#processDispatchResult方法中得到并校验参数
    2022-12-14归属地:四川
    1
  • 唐国强
    很多问题真的是没有仔细学习文档挖的坑,反而浪费了时间
    2022-01-12
    1
  • Monday
    思考题:解析器为 org.springframework.web.servlet.mvc.method.annotation.PathVariableMethodArgumentResolver,触发debug了半天没找着。
    2021-07-10
    1
    1
  • X
    org.springframework.web.servlet.mvc.method.annotation.PathVariableMethodArgumentResolver cglib代理校验 org.springframework.validation.beanvalidation.MethodValidationInterceptor
    2023-07-18归属地:北京
  • 路在哪
    负责解析ID值的参数解析器是:PathVariableMethodArgumentResolver 负责校验ID的解析器是:ServletRequestMethodArgumentResolver
    2022-12-14归属地:四川
  • 子夜枯灯
    打卡,完成本节课程
    2022-02-07
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部