【开发者必备】Spring Boot 2.7.x:WebMvcConfigurer配置手册来了(七)!

关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言

上一期我们介绍了两个MessageConverters和两个ExceptionResolvers,分别是消息转化器和异常处理器,用来处理请求体和响应体。今天我们将分享关于WebMvcConfigurer配置的最后一节,这一节有两个方法:

  • getValidator
  • getMessageCodesResolver

02 方法17

getValidator

java 复制代码
@Nullable
default Validator getValidator() {
    return null;
}

作用 :用于执行对象的数据验证,支持JSR-303 Bean Validation标准。

使用场景

  • 自定义参数验证器
  • 配置HibernateValidator校验的快速失败

2.1 使用说明

在使用之前,我们先了解一下validator是如何加载的。

自动装配的时候,org.springframework.validation.Validator需要配置实例化,从而出发配置类的getValidator方法。

如果获取到就使用配置的,如果没有获取到就加载已经存在的Bean(javax.validation.Validator.class)。如果还是没有,就会通过OptionalValidatorFactoryBean创建validator

所以我们可以通过getValidator的方式配置,也可以自定义Bean

2.2 自定义参数验证器

需要实现org.springframework.validation.Validator接口。

java 复制代码
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不能为空");
        }
    }
}

自定义校验器简单的判断了参数是否为空。

2.4 配置

java 复制代码
@Override
public Validator getValidator() {
    return new WjsonValidator();
}

2.5 控制层

java 复制代码
@GetMapping("/testWjson")
public void testWjson(@Validated Wjson wjson) {
    log.info("testWjson: wjson={} ", wjson);
}

2.6 测试结果

我们可以看到在参数不传的情况下,确实走了自定义的参数校验器,并抛出了org.springframework.validation.BindException

2.7 使用其他方式

如果想要使用注解校验参数,如:

我们需要引入校验依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

这个时候,我们不需要配置getValidator,使用系统的校验器,会自动识别注解校验。

当然也可以使用HibernateValidator.class,配置也有两种方式:

Bean定义

java 复制代码
@Bean
public javax.validation.Validator validator() {
    ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
            .configure()
            // 快速失败模式
            .failFast(true)
            .buildValidatorFactory();
    return validatorFactory.getValidator();
}

getValidator方式

java 复制代码
@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.Validatorjavax.validation.Validatororg.springframework.validation.Validator时,需要借助适配器SpringValidatorAdapter类。

03 方法18

getMessageCodesResolver

java 复制代码
@Nullable
default MessageCodesResolver getMessageCodesResolver() {
    return null;
}

作用:用于生成验证错误的消息代码,它根据验证失败的类型和字段生成一组有序的消息代码。

使用场景

  • 自定义异常信息Code

3.1 使用说明

getMessageCodesResolver方法使Validator内部的一个方法。当调用errors.rejectValue时会被调用。

3.2 自定义一组Code

java 复制代码
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]);
    }
}

3.3 配置

java 复制代码
@Override
public MessageCodesResolver getMessageCodesResolver() {
    return new CustomMessageCodesResolver();
}

3.4 测试

图中展示就是自定义的Code

04 小结

在参数校验的过程中一般都不需要我们自己配置,SpringBoot的自动装配已经很强大了。但是特殊场景需要我们定制开发,就需要了解框架为我们提供的扩展点。

总共经过7小结的整理,终于介绍完了WebMvcConfigurer的所有配置项。现在可能用不着,以后那一天可能就用到了。赶快收藏起来吧。

相关推荐
苏三说技术1 小时前
Claude Code从失控到起飞,只用了这些技巧
后端
长栎2 小时前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode2 小时前
Redis 在生产项目的使用
前端·后端
用户559822481222 小时前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode2 小时前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战2 小时前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha2 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn2 小时前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户762352425912 小时前
ShardingJDBC
后端
行者全栈架构师2 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端