不优雅的Controller
@RestController
@RequestMapping("/user/test")
public class UserController {
private static Logger logger = LoggerFactory.getLogger(UserController.class);
@Autowired
private UserService userService;
@Autowired
private AuthService authService;
@PostMapping
public CommonResult userRegistration(@RequestBody UserVo userVo) {
if (StringUtils.isBlank(userVo.getUsername())){
return CommonResult.error("用户名不能为空");
}
if (StringUtils.isBlank(userVo.getPassword())){
return CommonResult.error("密码不能为空");
}
logger.info("注册用户:{}" , userVo.getUsername());
try {
userService.registerUser(userVo.getUsername());
return CommonResult.ok();
}catch (Exception e){
logger.error("注册用户失败:{}", userVo.getUsername(), e);
return CommonResult.error("注册失败");
}
}
@PostMapping("/login")
@PermitAll
@ApiOperation("使用账号密码登录")
public CommonResult<AuthLoginRespVO> login(@RequestBody AuthLoginReqVO reqVO) {
if (StringUtils.isBlank(reqVO.getUsername())){
return CommonResult.error("用户名不能为空");
}
if (StringUtils.isBlank(reqVO.getPassword())){
return CommonResult.error("密码不能为空");
}
try {
return success(authService.login(reqVO));
}catch (Exception e){
logger.error("注册用户失败:{}", reqVO.getUsername(), e);
return CommonResult.error("注册失败");
}
}
}
优雅的Controller
@RestController
@RequestMapping("/user/test")
public class UserController1 {
private static Logger logger = LoggerFactory.getLogger(UserController1.class);
@Autowired
private UserService userService;
@Autowired
private AuthService authService;
@PostMapping("/userRegistration")
public CommonResult userRegistration(@RequestBody @Valid UserVo userVo) {
userService.registerUser(userVo.getUsername());
return CommonResult.ok();
}
@PostMapping("/login")
@PermitAll
@ApiOperation("使用账号密码登录")
public CommonResult<AuthLoginRespVO> login(@RequestBody @Valid AuthLoginReqVO reqVO) {
return success(authService.login(reqVO));
}
}
- 改造流程:
- 校验方式:
使用spring提供的@Valid
在入参时使用@Valid注解,并且在VO中使用校验注解。
@Vaild
在SpringBoot中,@Vaild是一个非常有用的注解,主要用于数据校验。
使用 @Valid 来验证参数:
在编写接口时,我们经常需要验证请求参数。通常, 我们可能会写大量的 if 和 if else 代码来进行判断。但这样写的代码不仅不优雅,而且如果存在大量的验证逻辑,这会使代码看起来混乱,大大降低代码的可读性。为了简化这个过程,我们可以使用@Valid注解来帮助我们简化验证逻辑。
@Valid 注解的作用:
@Valid 的主要作用是用于数据校验,可以在定义的实体中的属性上,添加不同的注解来完成不同的校验规则,而在接口类中的接收数据参数中添加 @Valid 注解,这时实体将会开启一个校验功能。
@Valid 的相关注解:
在实体类中不同的属性添加不同的注解,就能实现不同数据的校验功能。
使用 @Valid 进行参数的校验步骤:
整个过程如下,用户访问接口,然后进行参数校验,因为@Valid 不支持平面的参数校验 (直接写在参数中字段的校验) 所以基于 GET 请求的参数还是按照原先方式进行校验,而 POST 则可以以实体对象为参数, 可以使用 @Valid 方式进行校验。如果校验通过,则进入业务逻辑,否则抛出异常,交由全局异常处理器处理。
@Validated 与 @Valid 的区别:
@Validated 是 @Valid 的变体。通过声明实体中的属性的 groups,再搭配 @Validated,就能决定哪些属性需要校验,哪些不需要校验。