时间:2021-05-20
接触springboot一年多,是时候摆脱这种校验方式了233 ,每个参数都if判断,一眼看过去就是很low的程序员。
Validation有了这个插件就再也不用这样去校验参数了,可以让我们在项目中不用浪费很多时间在参数校验这里,从而更专注于业务逻辑
首先引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>这里创建一个用户的DTO对象
@Data@ApiModel("用户-表单对象")public class SportsUserCreatForm{ @ApiModelProperty(value="用户唯一标识",example = "0") @NotNull(groups = {Update.class}) private long id; @ApiModelProperty(value = "所属机构唯一标识(冗余字段)", example = "0") private long organizationId; @ApiModelProperty("登录用户名") @NotBlank(message = "用户名不能为空") @Length(max = 10, message = "用户名最长为10位") private String loginName; @ApiModelProperty("密码") private String password; @ApiModelProperty("手机号") private String phone; @ApiModelProperty("邮箱") private String email; @ApiModelProperty("性别( 'MALE', 'FEMALE' )") @NotNull(message = "用户性别不能为空") private SportsUserEnumGender gander; @ApiModelProperty(value = "出生日期-13位时间戳",example = "0") private long birthday; @ApiModelProperty("身份证号") private String idNumber; @ApiModelProperty("用户昵称") private String nickname; }在controller层添加@Validated注解,添加注解之后spring就会逐个校验DTO中加了校验注解的字段,完全通过才可以进入业务处理,否则就会抛出MethodArgumentNotValidException异常
@PostMapping("user/add") @RequiresAuthentication @ApiOperation("添加用户") public SportsUser addUser(@Validated @RequestBody SportsUserCreatForm user) throws Exception{ return userBiz.addUser(user); }一般项目来说抛出异常都会有约定好的JSON格式返回错误码和错误信息,如果不处理就无法按照约定格式返回。这里我们可以通过声明全局异常处理类来拦截异常并将异常处理成前端能操作的JSON数据。(这里只需要关注MethodArgumentNotValidException异常)
@Slf4j@Order(Ordered.HIGHEST_PRECEDENCE)@RestControllerAdvicepublic class GlobalExceptionAdvice { @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public ResponseEntity<Object> handleBeanValidation(HttpServletResponse res, MethodArgumentNotValidException e) throws Exception{ res.setStatus(HttpStatus.OK.value()); List<ObjectError> errors = e.getBindingResult().getAllErrors(); ObjectError error = errors.get(0);// 如果有多个异常,这里只取第一个异常。没有必要把所有异常都抛出(错就是错,第一个校验都没通过,自然也轮不到第二个校验。) String json = JsonUtils.obj2json(error); Map map = JsonUtils.json2map(json); OkMessage result = new OkMessage(); result.setMsg("请求参数错误"e.getBindingResult().getFieldError().getDefaultMessage() + "]"); result.setCode("PARAM-000001"); return new ResponseEntity<>(result, HttpStatus.OK); }}有的人就要发问了,"啊,你这校验不行啊,我在添加的时候id是自动生成的不需要校验,编辑的时候就需要校验id了,我是不是要建两个一模一样的DTO,这样岂不是显得我很憨?!这不是增加无用代码吗?差评!"
其实不然,在此我们可以用到 groups 属性来解决此场景下的问题。
声明分组
注意:在声明分组的时候尽量继承 extend javax.validation.groups.Default。 否则,在你声明@Validated(Update.class)的时候,就会出现你在默认没添加groups = {}的时候的校验组@Email(message = "邮箱格式不对")不会自动校验,因为默认的校验组是groups = {Default.class}。
import javax.validation.groups.Default; /** * 数据新增分组 */public interface Create extends Default { } import javax.validation.groups.Default; /** * 数据更新分组 */public interface Update extends Default { }修改Controller中的@Validated注解,声明校验分组(下面用的是Create.class所以并不会校验id)
@PostMapping("user/add") @RequiresAuthentication @ApiOperation("添加用户") public SportsUser addUser(@Validated(Create.class) @RequestBody SportsUserCreatForm user) throws Exception{ return userBiz.addUser(user); }此处只列出Hibernate Validator提供的大部分验证约束注解,请参考hibernate validator官方文档了解其他验证约束注解和进行自定义的验证约束注解定义。
到此这篇关于Spring boot validation校验的文章就介绍到这了,更多相关Springboot validation校验内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、参数校验springboot使用校验框架validation校验方法的入参SpringBoot的Web组件内部集成了hibernate-validator,
项目升级到springboot2.3之后,参数校验的注解报错,发现spring-boot-starter-web的依赖项已经去除了依赖点开spring-boot
一、spring-boot-starter-validation依赖概述上一篇《SpringBootWeb开发注解篇》,就可以快速地进行Web开发。那么在表单提
创建项目使用IDEA创建一个spring-boot项目,依赖选上web,validation,freemarker即可先看看效果创建实体类创建并加上注解,代码如
本文实例讲述了JavaScript实现信用卡校验方法。分享给大家供大家参考。具体分析如下:这里JavaScript版的信用卡校验代码,采用了Luhn算法func