JAVASpring

Springboot中@Validated注解使用

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