商城首页欢迎来到中国正版软件门户

您的位置:首页 >优雅校验配置非空并抛出异常的技巧

优雅校验配置非空并抛出异常的技巧

  发布于2026-04-16 阅读(0)

扫一扫,手机访问

如何优雅地校验配置属性非空并抛出 RuntimeException

本文介绍在 Java 静态初始化块中,通过封装校验逻辑(而非重复 if 判空)来确保所有必需配置项均被正确加载且不为 null,避免手动逐个检查的冗余代码。

本文介绍在 Java 静态初始化块中,通过封装校验逻辑(而非重复 if 判空)来确保所有必需配置项均被正确加载且不为 null,避免手动逐个检查的冗余代码。

在构建配置驱动型应用(如基于 application.properties 的 Spring Boot 外部化配置替代方案)时,确保关键系统属性在启动时完整、非空至关重要。若缺失某项(例如 aws.bucket.digitalassetsuploads),程序应立即失败并给出明确错误,而非延迟到运行时因 NullPointerException 崩溃。

最简洁、可维护的实践是将“读取 + 非空校验”封装为一个私有静态工具方法,而非为每个字段添加独立的 if (x == null) throw ...。如下所示:

import java.io.IOException;
import java.util.Properties;

public class AppProperties {

    public static final String DIGITAL_ASSETS_UPLOADS_BUCKET;
    public static final String REGION;
    public static final String APP_PEEFIX;  // 注意:原代码中拼写为 PEERFIX,此处保留原文拼写
    public static final String ACCOUNT_NUMBER;
    public static final String TEXTRACT_SSM_SNS_NAME;
    public static final String TEXTRACT_SSM_SQS_NAME;

    static {
        Properties prop = new Properties();
        try {
            prop.load(AppProperties.class.getClassLoader()
                .getResourceAsStream("application.properties"));
        } catch (IOException e) {
            throw new RuntimeException("Failed to load application.properties from classpath", e);
        }

        // 统一使用安全读取方法,自动校验非空
        DIGITAL_ASSETS_UPLOADS_BUCKET = getNonNullProperty(prop, "aws.bucket.digitalassetsuploads");
        REGION = getNonNullProperty(prop, "aws.region");
        APP_PEEFIX = getNonNullProperty(prop, "cdk.appprefix");
        ACCOUNT_NUMBER = getNonNullProperty(prop, "aws.accountnumber");
        TEXTRACT_SSM_SNS_NAME = getNonNullProperty(prop, "aws.ssm.sns.textract");
        TEXTRACT_SSM_SQS_NAME = getNonNullProperty(prop, "aws.ssm.sqs.textract");
    }

    /**
     * 安全获取配置值:若指定 key 不存在或值为 null,则抛出 RuntimeException
     * @param props 配置源
     * @param key 属性键名
     * @return 非空字符串值
     */
    private static String getNonNullProperty(Properties props, String key) {
        String value = props.getProperty(key);
        if (value == null || value.trim().isEmpty()) {
            throw new RuntimeException("Missing or empty required property: '" + key + "'");
        }
        return value.trim(); // 自动去除首尾空白,增强健壮性
    }
}

优势说明

  • 单一职责清晰:getNonNullProperty 专注“读取 + 校验”,与业务逻辑解耦;
  • 错误信息精准:异常消息直接包含缺失的 key,便于快速定位问题配置项;
  • 空字符串防护:扩展支持 trim().isEmpty(),防止配置文件中误填空格导致逻辑异常;
  • 零依赖、零注解:无需引入额外框架或编译期注解处理器(如 @NotNull + Checker Framework),纯 Java 标准实现;
  • 易于扩展:后续新增配置项只需一行调用,无需修改校验逻辑。

⚠️ 注意事项

  • 此方案适用于启动即校验场景(如 static 块),不适用于动态重载配置;
  • 若需更高级能力(如类型转换、默认值回退、分组校验),建议迁移到 Spring Boot 的 @ConfigurationProperties 或 Jakarta Config 等标准化配置管理方案;
  • 生产环境建议配合配置中心(如 AWS Systems Manager Parameter Store)与 CI/CD 阶段的配置 Schema 校验,实现多层防护。

该模式虽无 Kotlin 的 by lazy { requireNotNull(...) } 那般语法糖,但以极简、可控、可读的方式达成了同等可靠性目标——让失败发生在最早、最明确的时刻。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注