SpringBoot - 优雅的实现【应用启动参数校验】

简介: SpringBoot - 优雅的实现【应用启动参数校验】


需求

有个参数非常非常非常非常非常重要,如果未配置 或者 配置不正确, 不能启动应用。


我们使用Spring提供的Java Validation功能来实现这个“牛逼”的需求


三部曲

Step1 Properties类搞上Validation相关配置

package com.artisan.startvalidator.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotEmpty;
/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 */
@Validated
@Component
@Data
@ConfigurationProperties(prefix = "artisan")
public class ArtisanConfigProperties {
    @NotEmpty(message = "必须配置[artisan.code]属性")
    private String code;
}

上面的配置就会校验在application配置文件中有没有配置artisan.code 。若没有配置,项目启动就会失败,并抛出校验异常。

温馨小提示: 在使用配置文件校验时,必须使用@configurationproperties注解,@value不支持该注解

Step2 启动测试

Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'artisan' to com.artisan.startvalidator.config.ArtisanConfigProperties failed:
    Property: artisan.code
    Value: null
    Reason: 必须配置[artisan.code]属性

Step3 配上试试

随便搞个测试

当然了,根据你的需求,你也可以用框架提供的其他注解

校验规则 规则说明
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 验证注解的元素值(日期类型)比当前时间早
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

自定义校验规则

当上面这些注解都满足不了你的时候…


那干脆自定义一个

Step1 搞接口实现

自定义校验逻辑规则,实现org.springframework.validation.Validator

package com.artisan.startvalidator.validator;
import com.artisan.startvalidator.config.ArtisanConfigProperties;
import org.springframework.util.StringUtils;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 */
public class ArtisanCustomConfigPropertiesValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        // 父类.class.isAssignableFrom(子类.class)
        return ArtisanConfigProperties.class.isAssignableFrom(clazz);
    }
    @Override
    public void validate(Object target, Errors errors) {
        ArtisanConfigProperties config = (ArtisanConfigProperties) target;
        if (StringUtils.isEmpty(config.getCode())) {
            errors.rejectValue("code", "artisan.code.empty", "[artisan.code] 属性必须要在配置文件application.properties中配置");
        } else if (config.getCode().length() < 8) {
            errors.rejectValue("id", "artisan.code.short", "[artisan.code] 属性的长度需要大于8");
        }
    }
}

Step 2 搞属性文件

使用自定义校验规则就不需要在使用原生的@NotEmpty了, 删除即可

Step 3 搞自定义校验规则

注入自定义校验规则, 写个配置类,@Bean一把

package com.artisan.startvalidator.config;
import com.artisan.startvalidator.validator.ArtisanCustomConfigPropertiesValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 */
@Configuration
public class AppConfiguration {
    /**
     * bean的方法名必须要 configurationPropertiesValidator,否则启动的时候不会执行该校验
     *
     * @return
     */
    @Bean
    public ArtisanCustomConfigPropertiesValidator configurationPropertiesValidator() {
        return new ArtisanCustomConfigPropertiesValidator();
    }
}

bean的方法名必须要 configurationPropertiesValidator,否则不生效。

Step 4 验证一把

改改application.properties 的 artisan.code

不配置试一下

可以看到错误信息就是自定义校验的输出



源码

https://github.com/yangshangwei/boot2


相关文章
|
29天前
|
JSON 前端开发 Java
Spring MVC——获取参数和响应
本文介绍了如何在Spring框架中通过不同的注解和方法获取URL参数、上传文件、处理cookie和session、以及响应不同类型的数据。具体内容包括使用`@PathVariable`获取URL中的参数,使用`MultipartFile`上传文件,通过`HttpServletRequest`和`@CookieValue`获取cookie,通过`HttpSession`和`@SessionAttribute`获取session,以及如何返回静态页面、HTML代码片段、JSON数据,并设置HTTP状态码和响应头。
48 1
Spring MVC——获取参数和响应
|
1月前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
2月前
|
缓存 前端开发 Java
springboot 的单体服务 字典参数转译
本文介绍了如何在Spring Boot项目中使用缓存来管理字典参数,并确保前后端数据一致性。首先,通过`@EnableCaching`启用缓存功能,接着创建一个自定义的字典缓存类`DicCache`。然后,通过配置类将`DicCache`添加到`cacheManager`中。此外,对字典服务进行改造,使用`@CachePut`和`@CacheEvict`注解保证数据一致性。最后,实现自定义注解`@DicSerializer`和序列化处理类`DictSerializerHandel`,用于在序列化过程中自动转换字典值。通过这种方式,可最小化代码改动并提高系统性能。
springboot 的单体服务 字典参数转译
|
1月前
|
前端开发 Java Spring
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
102 2
|
2月前
|
JSON Java 数据格式
springboot 参数统一处理
springboot 参数统一处理
|
1月前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
117 0
|
2月前
|
Java Spring
spring boot 启动项目参数的设定
spring boot 启动项目参数的设定
|
3月前
|
XML Java 数据库
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
这篇文章是Spring5框架的实战教程,详细介绍了事务的概念、ACID特性、事务操作的场景,并通过实际的银行转账示例,演示了Spring框架中声明式事务管理的实现,包括使用注解和XML配置两种方式,以及如何配置事务参数来控制事务的行为。
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
|
3月前
|
Java API 数据格式
Spring Boot API参数读取秘籍大公开!6大神器助你秒变参数处理大师,让你的代码飞起来!
【8月更文挑战第4天】Spring Boot凭借其便捷的开发和配置特性,成为构建微服务的热门选择。高效处理HTTP请求参数至关重要。本文介绍六种核心方法:查询参数利用`@RequestParam`;路径变量采用`@PathVariable`;请求体通过`@RequestBody`自动绑定;表单数据借助`@ModelAttribute`或`@RequestParam`;请求头使用`@RequestHeader`;Cookie则依靠`@CookieValue`。每种方法针对不同场景,灵活运用可提升应用性能与用户体验。
66 9