Spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
添加依赖
如果用Spring-boot-starter-web 就不需要重复添加 spring-boot-starter-validation 依赖了,但如果没用 web 依赖时候想要实现 Bean 验证,则只要单加入 spring-boot-starter-validation 依赖即可。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
在bean上声明需要被校验的字段
/** * @author Boss */ @ApiModel("注册DTO") @Data public class RegisterDTO { @ApiModelProperty(value = "账户(小于等于12位,大于等于8位字符)", required = true) @Size(max = 12,min = 8) @NotBlank private String account; @ApiModelProperty(value = "密码(小于等于12位,大于等于8位字符)", required = true) @Size(max = 12,min = 8) @NotBlank private String password; @ApiModelProperty(value = "昵称(小于等于12位,大于等于8位字符)", required = true) @Size(max = 12,min = 8) @NotBlank private String name; @Override public String toString() { return "RegisterDTO{" + "account='" + account + '\'' + ", password='" + password + '\'' + ", name='" + name + '\'' + '}'; } }
可以在 Controller的方法上使用@Validated ,这样只验证该方法的RequestBody参数。
/** * 注册接口 * * @param registerDTO * @return */ @ApiOperation("注册接口(账户、昵称不能重复)[不需要token]") @PostMapping("register") public ResponseVO<Object> register(@RequestBody @Validated RegisterDTO registerDTO) throws InterruptedException { log.info("请求接口 /netsadcloud/user/register 参数:{}", JSON.toJSONString(registerDTO)); return userService.register(registerDTO); }
也可以在Controller类添加注解@Validated (这样整个控制器的方法都会验证参数)
@Validated @RestController @RequestMapping("/api") public class PersonController { @GetMapping("/person/{id}") public ResponseEntity<Integer> getPersonByID(@Validated @PathVariable("id") @Max(value = 5,message = "超过 id 的范围了") Integer id) { return ResponseEntity.ok().body(id); } @PutMapping("/person") public ResponseEntity<String> getPersonByName(@Validated @RequestParam("name") @Size(max = 6,message = "超过 name 的范围了") String name) { return ResponseEntity.ok().body(name); } }
@validated注解说明