首先我们先了解一下@Valid的只要用途:主要用于表单验证,减轻了代码量。
@Valid注解可以搭配的注解有
@NotNull:不能为空
@Length(message=“参数的长度在{min}~{max}之间”,min=1,max=10):设置长度
@Past:设置日期只能为过去日期
@Email:设置为邮箱格式
Maven项目引入依赖
jakarta.validation jakarta.validation-api 3.0.2 org.hibernate.validator hibernate-validator 7.0.4.Final
接下来实战演示,在我们使用@Valid注解之前我们需要先写一个异常统一处理的方法,用于规范参数不全时返回
package com.zry.base_server.exception;
import com.zry.base_server.common.base.enums.SystemHttpResponseEnum;
import com.zry.base_server.common.web.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.Objects;
@Slf4j
@RestControllerAdvice
public class ExceptionHandling {
@ExceptionHandler(MethodArgumentNotValidException.class)
public JsonResult handleValidException(MethodArgumentNotValidException e) {
log.error("请求参数异常");
e.printStackTrace();
return JsonResult.error(SystemHttpResponseEnum.PARAM_ERROR.getCode(), Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
}
}
接下来是Controller层
@Slf4j
@RestController
public class LoginController {
@Resource
private UserService userService;
@PostMapping("login")
public JsonResult login(@Valid @RequestBody LoginDTO login) {
log.info("账号:{},密码:{}", login.getAccount(), login.getPassword());
UserPO user = userService.findUserByAccount(login.getAccount());
if (user == null) {
log.error("LoginController:login:账号不存在,请检查账号是否输入错误");
return JsonResult.error(SystemHttpResponseEnum.LOGIN_ERROR.setMsg("账号不存在,请检查账号是否输入错误。"));
}
String psd = Md5Util.encryption(login.getPassword());
if (!user.getPassword().equals(psd)) {
log.error("LoginController:login:密码输入错误");
return JsonResult.error(SystemHttpResponseEnum.LOGIN_ERROR.setMsg("密码输入错误。"));
}
return JsonResult.success().setData(new TokenVO(JwtUtil.create(user.getId())));
}
}
重点要来喽
package com.zry.base_server.bean.login;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
@Data
public class LoginDTO {
@NotEmpty(message = "请输入账号")
private String account;
@NotEmpty(message = "请输入密码")
private String password;
}
我们只需要在接受实体的字段上加入上面说的注解,在接口被请求的时候就会帮助我们进行表单验证以及返回指定消息啦。
我们看一下返回
{
"code": 90004,
"msg": "请输入账号",
"data": ""
}



