通常我们在编写后端接口时,一般都需要对参数(请求数据)进行校验。参数校验的重要性自然不必多说,先来看一下我们通常是如何进行参数校验的?
StringaddUser(User user) {
// 参数校验
if (user == null || user.getId() == null || user.getAccount() ==null || user.getPassword() == null || user.getEmail() == null) {
return "对象或者对象字段不能为空";
}
if (StringUtils.isEmpty(user.getAccount()) ||StringUtils.isEmpty(user.getPassword()) ||StringUtils.isEmpty(user.getEmail())) {
return"不能输入空字符串";
}
if (user.getAccount().length() < 5 ||user.getAccount().length() > 10) {
return"账号长度必须是5-10个字符";
}
if (user.getPassword().length() < 5 ||user.getPassword().length() > 10) {
return"密码长度必须是5-10个字符";
}
if(!Pattern.matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$",user.getEmail())) {
return "邮箱格式不正确";
}
// 执行业务逻辑
// do something
return "true";
}
如上所见,我们最常见的做法就是在业务层使用if-else进行校验,这种做法在逻辑上没有问题,同样也能实现预期效果。但是这种做法过于繁琐,在业务层包含了大量的校验代码,实在不够优雅,失去了可读性以及美观程度。
为了解决这些问题,我们可以使用SpringValidation来改进参数校验方式。
首先,需要引入相关依赖:
引入依赖后我们就可以使用validation了,接下来看下具体使用方式:
1、为实体类的参数添加相应注解
springvalidation可以很方便的制定校验规则,并且能自动完成校验。我们只要在需要校验的字段上加入相关注解,同时可以指定校验失败的提示信息。
注:下面表格中列出一些常用校验注解供参考。
注解 | 功能 |
@AssertFalse | 可以为null,如果不为null的话必须为false |
@AssertTrue | 可以为null,如果不为null的话必须为true |
@DecimalMax | 设置不能超过最大值 |
@DecimalMin | 设置不能超过最小值 |
@Digits | 设置必须是数字且数字整数的位数和小数的位数必须在指定范围内 |
@Future | 日期必须在当前日期的未来 |
@Past | 日期必须在当前日期的过去 |
@Max | 最大不得超过此最大值 |
@Min | 最大不得小于此最小值 |
@NotNull | 不能为null,可以是空 |
@Null | 必须为null |
@Pattern | 必须满足指定的正则表达式 |
@Size | 集合、数组、map等的size()值必须在指定范围内 |
必须是email格式 | |
@Length | 长度必须在指定范围内 |
@NotBlank | 字符串不能为null,字符串trim()后也不能等于“” |
@NotEmpty | 不能为null,集合、数组、map等size()不能为0;字符串trim()后可以等于“” |
@Range | 值必须在指定范围内 |
@URL | 必须是一个URL |
2、在控制器层进行注解声明
校验规则和错误提示信息配置完毕后,只需要在控制器需要校验的对象上加入@Valid注解即可。
3、统一异常处理
前两步配置完成后,当传入参数不满足校验规则时,程序就会抛出MethodArgumentNotValidException异常。我们通过spring统一异常处理,将该异常封装成规范响应格式。
测试效果:
我们故意传入一个不符合规则的参数,可以看到响应已经符合预期效果。
Springboot接口参数校验方式改进为validation后,业务方法中只包含业务逻辑,代码变得更加简洁明了;同时降低了代码耦合度,让业务层只需关注业务逻辑,轻松构建后端接口;并且validation提供了很多丰富的校验规则,只需要加上注解即可使用,大家可以继续查阅官方文档了解。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/129984.html
摘要:方案一借助对方法级别数据校验的能力首先必须明确一点此能力属于框架的,而部分框架。 每篇一句 在金字塔塔尖的是实践,学而不思则罔,思而不学则殆(现在很多编程框架都只是教你碎片化的实践) 相关阅读 【小家Java】深入了解数据校验:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例【小家Spr...
摘要:毕竟永远相信本文能给你带来意想不到的收获使用示例关于数据校验这一块在中的使用案例,我相信但凡有点经验的程序员应该没有不会使用的,并且还不乏熟练的选手。 每篇一句 NBA里有两大笑话:一是科比没天赋,二是詹姆斯没技术 相关阅读 【小家Java】深入了解数据校验:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validati...
摘要:否则非法请求参数小则影响用户体验或者产生垃圾数据,大则会拖跨整个系统其次,手工对所有的参数进行校验相当繁琐,容易出错,而且最后,通过工具来完成其实是比较好的方式,但是必须让工具变得优雅一些。 声明:本文属原创文章,始发于公号:程序员自学之道,同步发布到 sf,转载请注明出处。 不够好的方案 在 Web 开发中, 我们经常需要校验各种参数,这是一件繁琐又重要的事情,对于很多人来说,在做参...
摘要:前言估计很多朋友都认为参数校验是客户端的职责,不关服务端的事。轻则导致服务器宕机,重则泄露数据。所以,这时就需要设置第二道关卡,服务端验证了。老项目的服务端校验不能为空不能为空看以上代码,就一个的校验就如此麻烦。 前言 估计很多朋友都认为参数校验是客户端的职责,不关服务端的事。其实这是错误的,学过 Web 安全的都知道,客户端的验证只是第一道关卡。它的参数验证并不是安全的,一旦被有心人...
摘要:和上标注的约束都会被执行注意如果子类覆盖了父类的方法,那么子类和父类的约束都会被校验。 每篇一句 没有任何技术方案会是一种银弹,任何东西都是有利弊的 相关阅读 【小家Java】深入了解数据校验:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例【小家Spring】Spring方法级别数据校...
阅读 1249·2023-01-11 13:20
阅读 1557·2023-01-11 13:20
阅读 1011·2023-01-11 13:20
阅读 1680·2023-01-11 13:20
阅读 3971·2023-01-11 13:20
阅读 2519·2023-01-11 13:20
阅读 1310·2023-01-11 13:20
阅读 3486·2023-01-11 13:20