Springboot使⽤AOP验证请求参数
⽬录
VO 声明验证
在 VO 中使⽤ straints 包提供的验证注解:
@Data
public class AnchorRecordVO {
@NotNull(message ="编号不能为空")
private Long num;
@NotNull(message ="天线编号不能为空")
private Integer antId;
private String site;
.
..
}
Controller 中使⽤ @Validated
在请求参数前使⽤ @Valid 注解就可以完成验证,验证结果将存放到 BindingResult 中。
@RequestMapping(value ="/anchors", method = RequestMethod.POST)
@ResponseBody
public ResultBean addAnchor(@RequestBody@ValidatedAnchorRecordVO vo, BindingResult bindingResult){
return new ResultBean(anchorService.save(vo));
}
使⽤ ControllerAdvice 统⼀处理
spring aop应用场景
定义⼀个异常处理, 使⽤ @ResponseBody 注解才能返回⾃定义格式,否则Spring 将包装⼀个返回结果,并且 HTTP Status 为400
@ControllerAdvice
@Slf4j
public class ControllerExceptionHandler {
/**
* 处理验证异常
*
* @param request
* @param exception
* @return
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public ResultBean handleBindException(HttpServletRequest request, MethodArgumentNotValidException exception){ ("访问"+ RequestURI()+"发⽣参数验证异常", exception);
ResultBean<?> result =new ResultBean();
String messages = BindingResult().getAllErrors()
.stream()
.map(ObjectError::getDefaultMessage)
.reduce((m1, m2)-> m1 +","+ m2)
.orElse("参数输⼊有误");
result.setMsg(messages);
result.setCode(FAIL);
return result;
}
/**
* 处理参数类型转换异常
*
* @param request
* @param exception
* @return
*/
@ExceptionHandler(InvalidFormatException.class)
@ResponseBody
public ResultBean handleParseException(HttpServletRequest request, InvalidFormatException exception){
String messages = String.format("字段 [%s] 的值 [%s] 不能转换成 [%s] 类型", PathReference(),
<("访问"+ RequestURI()+"发⽣参数验证异常 : {}", messages);
ResultBean<?> result =new ResultBean();
result.setMsg("参数类型输⼊有误");
result.setCode(FAIL);
return result;
}
}
类库说明
1. 注解说明
验证注解验证的数据类型说明
@AssertFalse Boolean,boolean验证注解的元素值是false
@AssertTrue Boolean,boolean验证注解的元素值是true
@NotNull任意类型验证注解的元素值不是null @Null任意类型验证注解的元素值是null
@Min(value=值)BigDecimal,BigInteger, byte,short, int, long,
等任何Number或CharSequence(存储的是数字)
⼦类型
验证注解的元素值⼤于等于@Min指定的value值
@Max(value=值)和@Min要求⼀样验证注解的元素值⼩于等于@Max指定的value值
@DecimalMin(value=
值)
和@Min要求⼀样验证注解的元素值⼤于等于@ DecimalMin指定的value值
@DecimalMax(value=
值)
和@Min要求⼀样验证注解的元素值⼩于等于@ DecimalMax指定的value值
@Digits(integer=整数
位数, fraction=⼩数位
数)
和@Min要求⼀样验证注解的元素值的整数位数和⼩数位数上限
@Size(min=下限,
max=上限)字符串、Collection、Map、数组等
验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、
集合⼤⼩
@Past java.util.Date,java.util.Calendar;Joda Time类库的
⽇期类型
验证注解的元素值(⽇期类型)⽐当前时间早
@Future与@Past要求⼀样验证注解的元素值(⽇期类型)⽐当前时间晚
@NotBlank CharSequence⼦类型验证注解的元素值不为空(不为null、去除⾸位空格后长度为0),不同于@NotEmpty,@NotBlank只应⽤于字符串且在⽐较时会去除字符串的⾸位空格
@Length(min=下限,
max=上限)
CharSequence⼦类型验证注解的元素值长度在min和max区间内
@NotEmpty CharSequence⼦类型、Collection、Map、数组验证注解的元素值不为null且不为空(字符串长度不为0、集合⼤⼩不为0)
@Range(min=最⼩值,
max=最⼤值)BigDecimal,BigInteger,CharSequence, byte,
short, int, long等原⼦类型和包装类型
验证注解的元素值在最⼩值和最⼤值之间
@Email(regexp=正则
表达式,flag=标志的模
式)CharSequence⼦类型(如String)
验证注解的元素值是Email,也可以通过regexp和flag指定⾃定义的email
格式
@Pattern(regexp=正
则表达式,flag=标志的
模式)
String,任何CharSequence的⼦类型验证注解的元素值与指定的正则表达式匹配
@Valid任何⾮原⼦类型指定递归验证关联的对象如⽤户对象中有个地址对象属性,如果想在验证⽤户对象时⼀起验证地址对象的话,在地址对象上加@Valid注解即可级联验证
验证注解验证的数据类型说明
2. 使⽤groups的校验
同⼀个对象要复⽤,但在不同场景下要求实效不同的校验规则, 如 ID 字段,在新增时不需要验证, 但在更新接⼝中要求不能为空。
2.1 先定义groups的分组接⼝
import ups.Default;
public interface Create extends Default {
}
import ups.Default;
public interface Update extends Default{
}
2.2 在验证类校验注解中使⽤
@NotNull(message ="id不能为空", groups = Update.class)
private Long userId;
2.3 Controller 中设置 Groups
public ResultBean update(@RequestBody@Validated(Update.class) UserVo userVo){
}
3. 在Controller接⼝中直接使⽤
3.1 接⼝⽅法中使⽤验证注解
public ResultBean getUser(@RequestParam("userId")@NotNull(message ="⽤户id不能为空") Long userId){ 3.2 Controller 中开启验证
@RestController
@RequestMapping("user/")
@Validated
public class UserController{...}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论