博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot请求参数校验和接口参数校验
阅读量:3722 次
发布时间:2019-05-22

本文共 4579 字,大约阅读时间需要 15 分钟。

小辉是写接口的一个小菜鸟,今天就看到了一段代码,里面判断参数是否为空长度是多少,格式对不对等就是一堆判断,然后代码中就很多判断,或者单独写了判断方法,如果请求类不复用,或者复用但是判断都一样的话可以优先使用请求层校验,或者接口层校验。

请求层就是在Controller就判断,接口层就是在Service判断。对于不复杂的场景这些校验其实够了。

一:常用注解

这个包下面的注解,是不是很熟悉呀?下面小辉给你讲一下常用的哦。

1、@Null

这个其实很容易就看出来了,他就是值为null,为空其他都会报错,如果强制请求方传null可以使用改注解.

2、@NotNull

这个注解就很熟悉了吧,很多地方你可能已经用到了,很多都是见名知意,不为null,可以放在任何类型上面,只会判断该值是不是null.

3、@NotBlank

这个注解NotBlank应该也是常用的,看这个方法

org.apache.commons.lang3.StringUtils.isNotBlank()

这样类似的方法都应该使用过吧,只是不同的第三方包而已,本质就一样都是判断字符串是不是null,为不为空,该注解对应的是使用了trim()方法去除空格后根据长度来判断为不为空的。如果不想请求的字段为null和为空就可以考虑使用这个注解了。

4、@NotEmpty

这个注解看名字就知道就是不为空,如果用在字符串上面就只会判断长度为不为0,和为不为null,并且可以使用在下面数据类型上Collection(集合),Map,Array(数组)

5、@Size

被注解的元素必须在指定的范围,可以用在字符串长度的控制,集合元素个数的限制,作用于Collection(集合),Map,Array(数组)

6、@DecimalMin

使用注解的字段必须为数字,并且该值不能小于指定的值

7、@DecimalMax

使用注解的字段必须为数字,并且该值不能大于指定的值

8、@Min

使用注解的字段值必须为数字,并且该值要大于等于指定值,可以使用到String类型,但是值必须为数字,否则不会通过,例如设置了最小值 200,传入000201也可以通过,前面的0都会被省略调。

9、@Max

使用注解的字段值必须为数字,并且该值要小于等于指定值,可以使用到String类型,但是值必须为数字,否则不会通过。

10、@AssertTrue

注解的是boolean类型,值必须为false

11、@AssertFalse

注解的是boolean类型,值必须为true

12、@Pattern

格式化字符串,使用正则表达式匹配 ,regex值为正则表达式

13、@Email

使用在字符类型,校验是不是邮箱

14、@Negative

使用在数字类型,对应的值小于0

15、@NegativeOrZero

使用在数字类型,对应的值小于等于0

16、@Positive

使用在数字类型,对应的值大于0

17、@PositiveOrZero

使用在数字类型,对应的值大于等于0

18、@Past

使用注解的是时间类型,并且时间小于当前时间

19、@PastOrPresent

使用注解的是时间类型,并且时间小于等于当前时间

20、@Future

使用注解的是时间类型,并且时间大于当前时间

21、@FutureOrPresent

使用注解的是时间类型,并且时间大于等于当前时间

22、@Digits

使用在数字类型和字符类型,主要判断数字值的整数精度和小数精度,

例如:@Digits(integer = 3, fraction = 2, message = "整数精度为3,小数精度为2"),如果整数超多3位,或者小数超过2位就会报错,如果是字符串整数前面的0是不算的哦。

 

二:使用校验方式

1、请求参数校验,在controller层校验

使用controller层校验直接加入以上注解,如果是参数是封装的实体类,实体类里面参数用以上注解,方法使用的实体类参数前面加入

@Validated

例如:

@DeleteMapping("/deleteCity")    @ApiOperation(value = "deleteCity", notes = "删除城市")    @ResponseBody    public Result deleteCity(@RequestBody @NotNull Long cityId) {        return cityService.deleteCity(cityId);    }
@PostMapping("/addCity")@ApiOperation(value = "addCity", notes = "新增城市(请求参数校验)")@ResponseBodypublic Result
addCity(@RequestBody @Validated CityEntity cityEntity) { return cityService.addCity(cityEntity);}
 

2、接口参数校验,主要在接口层校验

接口参数校验的话在接口类上面加注解@Validated然后在方法参数面前加注解@Valid

Result
addCity(@Valid CityEntity cityEntity);

 

这样校验是做了但是,如果你使用肯定希望错误了返回对应的message里面的信息吧,我们加入全局异常处理

import com.swagger.knife4jdemo.RequestCodeEnum;import com.swagger.knife4jdemo.common.Result;import lombok.NoArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.validation.BindingResult;import org.springframework.web.bind.MethodArgumentNotValidException;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;import javax.validation.ConstraintViolation;import javax.validation.ConstraintViolationException;import javax.validation.Path;import java.util.Iterator;import java.util.Set;/** * @author 哲思小辉 * @version 1.0.0 * @ClassName GlobalExceptionHandler.java * @Description 异常处理类 * @Param * @createTime 2020年03月25日 11:31:00 */@ControllerAdvice@Slf4j@NoArgsConstructorpublic class GlobalExceptionHandler {    @ExceptionHandler({Exception.class})    @ResponseBody    public Result handler(Exception e) {        // 接口参数验证        if (e instanceof ConstraintViolationException) {            log.error("接口参数异常:{}", e.getMessage());            Set
> constraintViolations = ((ConstraintViolationException) e).getConstraintViolations(); ConstraintViolation
next = constraintViolations.iterator().next(); Path propertyPath = next.getPropertyPath(); Path.Node lastPathNode = null; Iterator
iterator = propertyPath.iterator(); while (iterator.hasNext()) { lastPathNode = iterator.next(); } // 如果要返回字段就可以使用这个 name ,一般前端直接展示的话最好每一个判断里面都写message String name = lastPathNode == null ? "" : lastPathNode.getName(); return new Result(RequestCodeEnum.FAILURE.code, next.getMessage()); } else if (e instanceof MethodArgumentNotValidException) { log.error("请求参数异常:{}", e.getMessage()); MethodArgumentNotValidException ex = (MethodArgumentNotValidException) e; BindingResult bindingResult = ex.getBindingResult(); return new Result(RequestCodeEnum.FAILURE.code, bindingResult.getFieldError().getDefaultMessage()); } else { log.error("系统异常:{}", e); } return Result.failure(); }}

下面是我是使用后的参数异常打印出来的日志。

   

                                                文章同时会更新到公众号,觉得对你有帮助或者有用的可以关注一下哦 

转载地址:http://dgfnn.baihongyu.com/

你可能感兴趣的文章
Spring系列教程——12配置文件实现AOP
查看>>
Spring系列教程——13AspectJ讲解
查看>>
Spring系列教程——14Spring数据库操作讲解
查看>>
Spring系列教程——15Spring事务管理器
查看>>
Spring系列教程——16Aop事务配置与注解事务配置
查看>>
Spring系列教程——目录
查看>>
SpringMVC系列教程——02URL处理器映射
查看>>
SpringMVC系列教程——03处理器适配器讲解
查看>>
SpringMVC系列教程——04命令控制器讲解
查看>>
SpringMVC系列教程——05注解讲解
查看>>
SpringMVC系列教程——06控制器接收表单
查看>>
SpringMVC系列教程——07控制器页面显示专题
查看>>
Jquey实现Ajax
查看>>
SSM项目整合——04删除与显示商品功能的实现
查看>>
SSM项目整合——05商品页面编辑与更新功能实现
查看>>
SSM项目整合——06文件上传功能实现
查看>>
Form表单提交后获取下载文件到服务器以及获取文件之外的参数数据
查看>>
SSM项目整合——07OSCache缓存讲解
查看>>
SSM项目整合——08页面展示缓存使用
查看>>
SSM项目整合——09freemarker讲解
查看>>