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注解说明
