SpringBoot系列(五) 接口校验(非空、非法字符/特殊字符、长度等)

您所在的位置:网站首页 正则非空字符 SpringBoot系列(五) 接口校验(非空、非法字符/特殊字符、长度等)

SpringBoot系列(五) 接口校验(非空、非法字符/特殊字符、长度等)

2024-07-08 09:55| 来源: 网络整理| 查看: 265

1、引入pom依赖 javax.validation validation-api 2.0.1.Final org.hibernate.validator hibernate-validator 6.0.20.Final 2、实体类 单层校验

直接在类属性上使用注解

import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; public class ClassInfoVo { @Pattern(regexp = "^.{0,100}$", message = "班级id最长为100个字符") private String classId; @Pattern(regexp = "^.{0,100}$", message = "班级名最长为100个字符") @NotNull(message = "缺少必要的参数规则name") @NotBlank(message = "班级名不能为null,或者只包含空格") @NotEmpty(message = "班级name不能为null或者长度为0") private String className; } 嵌套多层

在对象属性上使用@Valid注解

import javax.validation.Valid; import java.util.List; public class SchoolInfo { private String schoolName; private String schoolId; @Valid private List rules; } public class ClassInfoVo { @Pattern(regexp = "^.{0,100}$", message = "班级id最长为100个字符") private String classId; @Pattern(regexp = "^.{0,100}$", message = "班级名最长为100个字符") @NotNull(message = "缺少必要的参数规则name") @NotBlank(message = "班级名不能为null,或者只包含空格") @NotEmpty(message = "班级name不能为null或者长度为0") private String className; } 3、控制层

使用@Valid注解

@RestController @RequestMapping(value = "/school") public class Controller { @Autowired private SchoolService schoolService; @PostMapping(value = "/query") public BaseResponse query(@RequestBody @Valid SchoolInfo infoVo) { return schoolService.query(infoVo); } } 4、全局异常处理 处理Get请求,抛出BindException异常 处理请求参数格式错误 @RequestParam上,抛出ConstraintViolationException异常 处理请求参数格式错误 @RequestBody上,抛出MethodArgumentNotValidException @ControllerAdvice public class YourProjectNameExceptionAdvice { private static final Logger LOGGER = LoggerFactory.getLogger(YourProjectNameExceptionAdvice.class); /** * 校验错误拦截处理 * 处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常 * * @param exception 错误信息集合 * @return 错误信息 */ @ResponseBody @ExceptionHandler(BindException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public BaseResponse bindExceptionHandler(BindException exception) { LOGGER.error("BindException encountered: {0}", exception); String message = exception.getBindingResult().getAllErrors().stream() .map(DefaultMessageSourceResolvable::getDefaultMessage) .collect(Collectors.joining()); return BaseResponse.newError("YourProjectName_BindException", message); } /** * 校验错误拦截处理 * 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException * * @param exception 错误信息集合 * @return 错误信息 */ @ResponseBody @ExceptionHandler(ConstraintViolationException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public BaseResponse constraintViolationHandler(ConstraintViolationException exception) { LOGGER.error("ConstraintViolation exception encountered: {0}", exception); return BaseResponse.newError("YourProjectName_ConstraintViolation", exception.getMessage()); } /** * 校验错误拦截处理 * 处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常。 * * @param exception 错误信息集合 * @return 错误信息 */ @ResponseBody @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public BaseResponse methodArgumentNotValidHandler(MethodArgumentNotValidException exception) { LOGGER.error("MethodArgumentNotValid exception encountered: {0}", exception); BindingResult bindingResult = exception.getBindingResult(); StringBuilder sb = new StringBuilder(); for (FieldError fieldError : bindingResult.getFieldErrors()) { sb.append(fieldError.getField()).append(": ").append(fieldError.getDefaultMessage()).append(", "); } return BaseResponse.newError("YourProjectName_MethodArgumentNotValid", sb.toString()); } } 5、如果多个请求参数校验失败,则遇到一个校验失败就抛出异常,接下来的异常参数不做校验。 @Configuration public class WebConfig { @Bean public Validator validator() { ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class) .configure() //failFast的意思只要出现校验失败的情况,就立即结束校验,不再进行后续的校验。 .failFast(true) .buildValidatorFactory(); return validatorFactory.getValidator(); } @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor(); methodValidationPostProcessor.setValidator(validator()); return methodValidationPostProcessor; } } 6、校验时常用注解

JSR303定义的校验类型

Constraint 详细信息 @Valid 递归的对关联对象进行校验,如果关联对象是个集合或者数组,那么对其中的元素进行递归校验 @Pattern(value) 符合指定的正则表达式(校验非法字符) @NotNull 参数不为 null @NotEmpty 参数不能为null,或者是空 @NotBlank() 参数不能为null,或者被Trim的长度是否大于0(可以用来校验全为空格字符) @Min() 一个数字,值大于给定值 @Max() 一个数字,值小于给定值 @Digits (integer, fraction) 一个数字,其值必须在可接受的范围内

举例代码中使用的比较代表的:

@Pattern(regexp = "^[\\u4E00-\\u9FA5\\w\\-]{1,57}$", message = "只能包含中文字符、英文字符、数字、下划线和中横线,1~57个字符") @Pattern(regexp = "^((?!=|\\+|-|@|>||


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3