最近了解到一本书《清单革命》,下面就列一下在 SpringMVC 中使用 Validation 的清单。
在 SpringBoot 项目中使用的话配置就简单很多,下面适用于传统的Spring项目。
1、pom.xml 文件中引入依赖
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.11.Final</version>
</dependency>
2、xml 配置。注意一定要开启 aop,否则后面检查绑定结果的切面无法工作。
<aop:aspectj-autoproxy/>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
</bean>
<mvc:annotation-driven validator=“validator"/>
3、自定义注解
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({METHOD})
@Retention(RUNTIME)
public @interface CheckBindingResult {
}
3、定义切面,处理绑定结果
@Aspect
@Component
public class CheckBindingResultAspect {
// 处理@Valid注解的校验结果
@Around("@annotation(CheckBindingResult)&& args(..,bindingResult)")
public Object handle(ProceedingJoinPoint joinPoint, BindingResult bindingResult) throws Throwable {
if (bindingResult.hasErrors()) {
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
for (FieldError fieldError : fieldErrors) {
String message = fieldError.getDefaultMessage();
return new ArgumentErrorResponse(message);
}
}
return joinPoint.proceed();
}
}
5、在 Controller 中使用
@PutMapping(value = "/{id}")
@ResponseBody
@CheckBindingResult
public Object update(@PathVariable("id") Long id, @RequestBody @Valid FormData formData, BindingResult bindingResult) {
// …
return null;
}