依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
自定义验证器
要确保验证器正常工作,需要确保以下几点:
- 验证器类(这里是LoginValidator)必须实现org.springframework.validation.Validator接口,并且必须有一个无参构造函数。
- 在控制器类中,必须使用@Validated注解来指示验证器应用于请求参数上。
- 在请求方法中,必须将请求参数作为参数传递给验证器,并且必须将验证器实例绑定到WebDataBinder。
LoginValidator.java
package com.example.springboot.valid;
import com.example.springboot.param.LoginParam;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
public class LoginValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return clazz.equals(LoginParam.class);
}
@Override
public void validate(Object target, Errors errors) {
if(target==null){
errors.rejectValue("",null,"用户不能为空");
return;
}
LoginParam loginParam=(LoginParam) target;
if(loginParam.getId()==0){
errors.rejectValue("id",null,"用户id不能为0");
}
if(loginParam.getPassword()==null|| loginParam.getPassword().equals("")){
errors.rejectValue("password",null,"用户密码不能为空");
}
}
}
绑定验证器
LoginRegisterController.java
package com.example.springboot.controller;
import com.example.springboot.param.LoginParam;
import com.example.springboot.service.UserService;
import com.example.springboot.valid.LoginValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@CrossOrigin
@RestController
public class LoginRegisterController {
@Autowired
private UserService userService;
@InitBinder
public void initBinder(WebDataBinder binder){
//绑定验证器
binder.setValidator(new LoginValidator());
}
@PostMapping("/login")
public String Login(@RequestBody LoginParam loginParam){
return userService.Login(loginParam);
}
@PostMapping("/register")
public String Register(@Validated @RequestBody LoginParam loginParam, Errors errors){
if(errors.hasErrors()){
String log="";
List<ObjectError> oes=errors.getAllErrors();
for(ObjectError oe:oes){
if(oe instanceof FieldError){
//字段错误
FieldError fe=(FieldError) oe;
log+=fe.getDefaultMessage()+"\n";
}else {
//对象错误
log+=oe.getDefaultMessage()+"\n";
}
}
return log;
}
return userService.Register(loginParam);
}
}
执行控制器方法前,先执行@InitBinder标注的方法,得到WebDataBinder对象。
binder.setValidator绑定验证器,获取参数后通过自定义的验证其去验证参数。
binder.registerCustomEditor可以进行参数的自定义。
@Validated代表启用验证机制(老版本是@Valid),自动将验证结果放入Errors对象中
fe.getField() 方法返回一个包含异常信息的 Field 对象,该对象描述了异常的字段。例如,如果异常是一个 ParseException 类型的异常,并且它表示一个日期格式错误,那么 getField() 方法将返回一个表示日期的字段的 Field 对象。
fe.getDefaultMessage() 方法返回一个字符串,该字符串表示默认的错误消息。如果未提供特定的错误消息,则该方法将返回一个描述异常类型的简单消息。例如,如果异常是一个 ParseException 类型的异常,并且没有提供特定的错误消息,那么 getDefaultMessage() 方法将返回一个简单的消息,例如 “java.text.ParseException”。
#直接通过注解使用JSR-303验证
LoginParam.java
package com.example.springboot.param;
import lombok.Data;
import jakarta.validation.constraints.NotNull;
import java.io.Serializable;
@Data
public class LoginParam implements Serializable {
@NotNull
private int id;
private String password;
}
JSR-303验证注解有:
@Null:校验对象是否为null。
@NotNull:校验对象是否不为null。
@NotBlank:校验字符串去头尾空格后的长度是否大于0或是否为null。
@NotEmpty:校验字符串是否为null或是否为empty。
@AssertTrue:校验Boolean是否为true。
@AssertFalse:校验Boolean是否为false。
@UniqueElements:校验数组/集合的元素是否唯一。
@Size(min,max):校验数组/集合/字符串长度是否在范围之内。
@Length(min,max):校验数组/集合/字符串长度是否在范围之内。
@Range(min,max):校验Integer/Short/Long是否在范围之内。
@Min(number):校验Integer/Short/Long是否大于等于value。
@Max(number):校验Integer/Short/Long是否小于等于value。
@Positive:校验Integer/Short/Long是否为正整数。
@PositiveOrZero:校验Integer/Short/Long是否为正整数或0。
@Negative:校验Integer/Short/Long是否为负整数。
@NegativeOrZero:校验Integer/Short/Long是否为负整数或0。
@DecimalMin(decimal):校验Float/Double是否大于等于value。
@DecimalMax(decimal):校验Float/Double是否小于等于value。
@Digits(integer,fraction):校验数字是否符合整数位数精度和小数位数精度。
@Past(date):校验Date/Calendar是否在当前时间之前。
@PastOrPresent(date):校验Date/Calendar是否在当前时间之前或当前时间。
@Future(date):校验Date/Calendar是否在当前时间之后。
@FutureOrPresent(date):校验Date/Calendar是否在当前时间之后或当前时间。
@Email:校验字符串是否符合电子邮箱格式。
@URL(protocol,host,port):校验字符串是否符合URL地址格式。
@CreditCardNumber:信用卡验证。
@Pattern(regexp):校验字符串是否符合正则表达式的规则。