【开发者必备】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.Validator。javax.validation.Validator转org.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的所有配置项。现在可能用不着,以后那一天可能就用到了。赶快收藏起来吧。

相关推荐
鱼宵32 分钟前
LangChain4j 结构化输出:让模型吐出 Java 对象,JSON 不再手写解析
java·开发语言·json·langchain4j
HSunR1 小时前
ruoyi 若依 自定义注解 参数校验
java·前端·数据库
Wang's Blog1 小时前
Java 项目部署之 Docker工具快速入门: Docker 是什么以及它如何解决部署环境问题
java·开发语言·docker
老木避暑研究所1 小时前
从原始数据到洞察:一次完整的避暑房环境数据采集、清洗与可视化分析
java·开发语言
前端 贾公子2 小时前
LangGraph == 图的状态(State)管理 (上)
java·开发语言·数据库
huaweichenai2 小时前
spring boot 实现file文件上传
java·spring boot·后端
VX_bysjlw9852 小时前
数码设备销售网站设计与实现39138-计算机毕设原创(免费领源码+带部署教程)
java·vue.js·spring boot·mysql·tomcat·mybatis·idea
荣码2 小时前
从0到1搭一个生产级RAG系统:串联前面21篇所有知识
java·python
xuxigifxfh2 小时前
牛客:HJ170 01序列
java·开发语言·算法·华为机考