请上车!火车防御特快官方中文版
74.8M · 2025-11-11
上一期我们介绍了两个MessageConverters和两个ExceptionResolvers,分别是消息转化器和异常处理器,用来处理请求体和响应体。今天我们将分享关于WebMvcConfigurer配置的最后一节,这一节有两个方法:
getValidatorgetMessageCodesResolver@Nullable
default Validator getValidator() {
return null;
}
作用:用于执行对象的数据验证,支持JSR-303 Bean Validation标准。
使用场景:
HibernateValidator校验的快速失败在使用之前,我们先了解一下validator是如何加载的。
自动装配的时候,org.springframework.validation.Validator需要配置实例化,从而出发配置类的getValidator方法。
如果获取到就使用配置的,如果没有获取到就加载已经存在的Bean(javax.validation.Validator.class)。如果还是没有,就会通过OptionalValidatorFactoryBean创建validator。
所以我们可以通过getValidator的方式配置,也可以自定义Bean。
需要实现org.springframework.validation.Validator接口。
public class WjsonValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return Wjson.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Wjson wjson = (Wjson)target;
if (StringUtils.isBlank(wjson.getContent())) {
errors.rejectValue("content", "WJSON_001","content不能为空");
}
if (StringUtils.isBlank(wjson.getVersion())) {
errors.rejectValue("version", "WJSON_002","version不能为空");
}
}
}
自定义校验器简单的判断了参数是否为空。
@Override
public Validator getValidator() {
return new WjsonValidator();
}
@GetMapping("/testWjson")
public void testWjson(@Validated Wjson wjson) {
log.info("testWjson: wjson={} ", wjson);
}
我们可以看到在参数不传的情况下,确实走了自定义的参数校验器,并抛出了org.springframework.validation.BindException
如果想要使用注解校验参数,如:
我们需要引入校验依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
这个时候,我们不需要配置getValidator,使用系统的校验器,会自动识别注解校验。
当然也可以使用HibernateValidator.class,配置也有两种方式:
Bean定义
@Bean
public javax.validation.Validator validator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
// 快速失败模式
.failFast(true)
.buildValidatorFactory();
return validatorFactory.getValidator();
}
getValidator方式
@Override
public Validator getValidator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
// 快速失败模式
.failFast(true)
.buildValidatorFactory();
return new SpringValidatorAdapter(validatorFactory.getValidator());
}
值得注意的是getValidator返回的org.springframework.validation.Validator,而ValidatorFactory生成的是javax.validation.Validator。javax.validation.Validator转org.springframework.validation.Validator时,需要借助适配器SpringValidatorAdapter类。
@Nullable
default MessageCodesResolver getMessageCodesResolver() {
return null;
}
作用:用于生成验证错误的消息代码,它根据验证失败的类型和字段生成一组有序的消息代码。
使用场景:
getMessageCodesResolver方法使Validator内部的一个方法。当调用errors.rejectValue时会被调用。
public class CustomMessageCodesResolver extends DefaultMessageCodesResolver {
@Override
public String[] resolveMessageCodes(String errorCode, String objectName, String field, Class<?> fieldType) {
System.out.println("resolveMessageCodes 。。。。。");
Set<String> codeList = new LinkedHashSet<>();
// 添加自定义消息代码
codeList.add(errorCode + "." + objectName + "." + field);
codeList.add(errorCode + "." + field);
codeList.add(errorCode + "." + fieldType.getSimpleName());
codeList.add(errorCode + "_这是我自定义的Code之一");
codeList.add(errorCode);
System.out.println(codeList);
return codeList.toArray(new String[0]);
}
}
@Override
public MessageCodesResolver getMessageCodesResolver() {
return new CustomMessageCodesResolver();
}
图中展示就是自定义的Code
在参数校验的过程中一般都不需要我们自己配置,SpringBoot的自动装配已经很强大了。但是特殊场景需要我们定制开发,就需要了解框架为我们提供的扩展点。
总共经过7小结的整理,终于介绍完了WebMvcConfigurer的所有配置项。现在可能用不着,以后那一天可能就用到了。赶快收藏起来吧。
74.8M · 2025-11-11
662M · 2025-11-11
906M · 2025-11-11