SpringBoot初始化枚举配置

1,340 阅读1分钟

1 enum是什么?如何在SpringBoot进行初始化?

 在javaenum可以看成一个静态变量,所以整个程序只一个,且是唯一的。而enum的通常都是字面量声明的,就是直接在代码直接声明的。而且它也是可以 被修改的。总结就是它是直接声明的静态变量,也可以在程序运行中动态更改。  现在先假设下有一个需要后期再次初始化的场景。就是拿enum作为SpringBoot的配置来使用,既然是配置,就有外部的配置加入进来合并,这时就是 需要再次修改enum的值了。

2 SpringBootenum配置初始化

思路就是,当SpringBoot启动完成时,这时配置也加载进来了,在这个时机就可以进行把外部的配置合并到enum中了。以下是一个错误码映射错误消息的初始化配置代码如下

mport lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;

public enum ErrorCodeConfig {
    VALIDATED_ERROR_TYPE(50001, "Validation error occurred."), // <-- 1 这是默认的错误码和对应的错误消息的默认配置
    INTERIOR_ERROR_TYPE(50000, "The error occurred inside the server."), // <-- 同上
    GRAPHQL_ERROR_TYPE(40000, "GraphQL error occurred."); // <-- 同上

    @Getter
    private int errorCode;

    @Getter
    @Setter // <-- 2 这里声明可设置该消息的方法
    private String errorMessage;

    ErrorCodeConfig(int errorCode, String errorMessage) {
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
    }

    @ConfigurationProperties(prefix = "exception")
    @PropertySource(value = "classpath:config/errorCodeMapMessage.properties") 3 // <-- 这里加载一个在resources/config/errorCodeMapMessage.propertiesA的配置
    @Component
    @Slf4j
    private static class InitializeErrorCodeConfig {
        @Getter
        private Map<Integer, String> errorCodeMapMessage = new HashMap<>(); // <-- 4 这里加载进来的外部配置

        @PostConstruct // <-- 这是SpringBoot 启动完成时,回调当前的方法
        private void init() {
            for (ErrorCodeConfig errorCodeConfig : EnumSet.allOf(ErrorCodeConfig.class)) {
                final var message = this.errorCodeMapMessage.get(errorCodeConfig.getErrorCode());
                if (message != null) {
                    errorCodeConfig.setErrorMessage(message);  // <-- 5 把外部配置同本地默认配置对比后,然后合并进来
                }
            }
        }
    }
}

config/errorCodeMapMessage.properties

exception.errorCodeMapMessage[50001] = Validation error occurred.
exception.errorCodeMapMessage[50000] = The error occurred inside the server.
exception.errorCodeMapMessage[40000] = GraphQL error occurred.