Skip to main content

12 SpringBoot初始化枚举配置

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.