在Spring框架中,验证是通过Validator
接口实现的。
作用:
Validator
接口用于定义对象的验证逻辑,以确保它们满足特定的业务规则和要求。使用场景:
优缺点:
示例:
public class PersonValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return Person.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Person person = (Person) target;
if (person.getAge() < 0) {
errors.rejectValue("age", "negativevalue");
} else if (person.getAge() > 110) {
errors.rejectValue("age", "too.darn.old");
}
}
}
作用:
Validator
可以对对象进行验证,确保其符合预定的规则和要求。使用场景:
优缺点:
示例:
@Service
public class PersonService {
private final Validator validator;
@Autowired
public PersonService(Validator validator) {
this.validator = validator;
}
public void doSomething(Person person) {
DataBinder dataBinder = new DataBinder(person);
dataBinder.setValidator(validator);
dataBinder.validate();
BindingResult bindingResult = dataBinder.getBindingResult();
if (bindingResult.hasErrors()) {
System.out.println(bindingResult.getAllErrors());
} else {
System.out.println("Person is valid");
}
}
}
在Spring框架中,数据绑定是通过DataBinder
类实现的。
作用:
DataBinder
类用于将请求参数绑定到目标对象,并可进行数据验证。使用场景:
优缺点:
示例:
@Service
public class PersonService {
private final Validator validator;
@Autowired
public PersonService(Validator validator) {
this.validator = validator;
}
public void doSomething(Map<String, String> parameters) {
Person person = new Person();
DataBinder dataBinder = new DataBinder(person);
dataBinder.setValidator(validator);
dataBinder.bind(new MutablePropertyValues(parameters));
dataBinder.validate();
BindingResult bindingResult = dataBinder.getBindingResult();
if (bindingResult.hasErrors()) {
System.out.println(bindingResult.getAllErrors());
} else {
System.out.println("Person is valid");
}
}
}
作用:
使用场景:
示例:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = AgeValidator.class)
public @interface ValidAge {
String message() default "Invalid age";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class AgeValidator implements ConstraintValidator<ValidAge, Integer> {
public void initialize(ValidAge constraint) {
}
public boolean isValid(Integer age, ConstraintValidatorContext context) {
return age >= 0 && age <= 150;
}
}
在这个示例中,我们创建了一个自定义的验证注解ValidAge
,并使用AgeValidator
来验证年龄是否合法。
作用:
使用场景:
示例:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public Map<String, String> handleValidationException(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(error ->
errors.put(error.getField(), error.getDefaultMessage()));
return errors;
}
}
在这个示例中,GlobalExceptionHandler
捕获MethodArgumentNotValidException
异常并返回带有验证错误的响应。
作用:
使用场景:
示例:
public interface CreateValidationGroup {
}
public interface UpdateValidationGroup {
}
public class Person {
@NotBlank(groups = {CreateValidationGroup.class, UpdateValidationGroup.class})
private String name;
@Min(value = 18, groups = CreateValidationGroup.class)
private int age;
// Other fields and methods
}
在这个示例中,我们使用校验分组CreateValidationGroup
和UpdateValidationGroup
对Person
类的属性进行不同的验证。
作用:
使用场景:
示例:
invalid.age=Age must be between 0 and 150.
在资源文件中定义错误消息,然后在验证注解中引用。
@Min(value = 18, message = "{invalid.age}")
private int age;
在这个示例中,当年龄验证失败时,会返回本地化的错误消息。
这些高级用法可以根据项目的实际需求进行定制和扩展,从而更好地满足复杂的验证和绑定场景。