本文共 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 ResultaddCity(@RequestBody @Validated CityEntity cityEntity) { return cityService.addCity(cityEntity);}
2、接口参数校验,主要在接口层校验
接口参数校验的话在接口类上面加注解@Validated然后在方法参数面前加注解@Valid
ResultaddCity(@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/