前端提交数据到后端,后端需要对数据进行验证。例如登录功能,前端提交用户名密码到后端,如果后端不做校验,可能导致空指针等异常。如果所有的校验都靠手动处理又太麻烦。有没有一种简洁的办法解决这个问题?
最近在一个开源项目看到比较优雅的写法,通过@Valid注解加BindingResult实现。
代码如下:
LoginController.java
//LoginController.java
@RestController
@RequestMapping
public class LoginController {
@Autowired
private UserService userService;
@Autowired
private TokenUtils tokenUtils;
@ApiOperation(value = "Login into the server and return token")
@PostMapping
public ResponseEntity login(@Valid @RequestBody UserLogin userLogin, @ApiIgnore BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
ResultMap resultMap = new ResultMap().fail().message(bindingResult.getFieldErrors().get(0).getDefaultMessage());
return ResponseEntity.status(resultMap.getCode()).body(resultMap);
}
UserLoginResult userLoginResult = new UserLoginResult(user);
User user = userService.userLogin(userLogin);
return ResponseEntity.ok(new ResultMap().success().payload(userLoginResult));
}
UserLogin.java
//UserLogin.java
@Data
public class UserLogin {
private static final String REG_USER_PASSWORD=".{6,20}";
@NotBlank(message = "Username cannot be empty")
private String username;
@NotBlank(message = "Password cannot be empty")
@Pattern(regexp = REG_USER_PASSWORD, message = "密码长度为6-20位")
private String password;
}