middleware_agent/src/main/java/com/cmcc/magent/config/CommonConfigure.java

186 lines
5.2 KiB
Java
Raw Normal View History

2025-01-15 01:57:10 +00:00
package com.cmcc.magent.config;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.net.InetAddress;
import java.util.Locale;
/**
* 通用配置类
* <p>
* 该配置类主要用于加载项目的公共配置属性并初始化全局变量
* </p>
*
* 主要功能包括
* <ul>
* <li>从配置文件加载项目的公共属性</li>
* <li>动态设置全局项目的基本 URL 和前缀 URL</li>
* <li>初始化与项目国际化默认 {@link Locale}和其他公共属性相关的配置</li>
* </ul>
*
* <p>
* 属性值通过 {@code application.yml} 文件中的 `common` 配置前缀加载
* </p>
*
* 示例
* <pre>
* common:
* tokenExpiredOfSeconds: 3600
* allowPasswdRetryTimes: 5
* locale: zh_CN
* showSqlCommand: true
* </pre>
*
* @author huangxin@cmhi.chinamobile.com
* @version 1.0.0
* @since 2025-01-07
*/
@Data
@ConfigurationProperties(prefix = "common")
@Configuration
@Slf4j
@SuppressWarnings({"java:S3008", "java:S1444", "java:S1104"})
public class CommonConfigure {
/**
* 项目的基础 URL
* <p>
* 由服务器的 IP 地址端口号和上下文路径动态生成
* </p>
*/
public static String BASEURL;
/**
* 项目的前缀 URL
* <p>
* 该值通常对应于项目的上下文路径Context Path
* </p>
*/
public static String PROJECT_PREFIX_URL;
/**
* 服务配置属性
* <p>
* 用于获取服务器的上下文路径端口号等信息
* </p>
*/
@Resource
private ServerProperties serverProperties;
/**
* Token 的过期时间单位
* <p>
* 表示用户登录的 Token 在多少秒后失效
* </p>
*/
private Integer tokenExpiredOfSeconds;
/**
* 允许的密码重试次数
* <p>
* 如果用户登录失败则累计失败次数超过该值时将触发账户锁定或其他安全策略
* </p>
*/
private Integer allowPasswdRetryTimes;
/**
* 默认的国际化语言区域
* <p>
* 格式为 {@code language_country}例如 {@code zh_CN} 表示简体中文
* 默认值为 {@code Locale.CHINA}
* </p>
*/
private String locale;
/**
* 是否显示 SQL 命令
* <p>
* 用于控制是否在日志中显示执行的 SQL 语句仅在调试模式下使用
* </p>
*/
private boolean showSqlCommand;
/**
* 数据文件保存目录
* <p>
* 用于创建本地数据文件
* </p>
*/
private String dataRootDirectory;
/**
* 中间件部署任务执行模式
* <p>
* 是否异步部署中间件接收到部署任务后尽快返回
* </p>
*/
private boolean asyncDeployment;
/**
* 设置全局静态变量的值
*
* @param prefixUrl 项目上下文路径Context Path
* @param baseUrl 项目的基础 URL包括协议主机地址和端口号
*/
private static void setGlobalVars(String prefixUrl, String baseUrl) {
PROJECT_PREFIX_URL = prefixUrl;
BASEURL = baseUrl;
}
/**
* 获取默认的语言区域Locale
* <p>
* 如果配置的语言格式不正确则返回系统默认的 {@link Locale#CHINA}
* </p>
*
* @return 默认的语言区域 {@link Locale}
*/
public Locale getDefaultLocale() {
2025-01-14 03:01:22 +00:00
final int localSegment = 2;
// 按下划线分割
String[] parts = locale.split("_");
2025-01-14 03:01:22 +00:00
if (localSegment == parts.length) {
return new Locale(parts[0], parts[1]);
}
// 如果格式不正确,则返回系统默认 Locale.CHINA
return Locale.CHINA;
}
/**
* 初始化全局变量的值
* <p>
* 该方法在 Bean 初始化完成后通过 {@link PostConstruct} 注解自动调用
* <ul>
* <li>初始化全局变量 {@code BASEURL} {@code PROJECT_PREFIX_URL}</li>
* <li>设置默认语言区域Locale</li>
* <li>打印重要的配置信息以供调试</li>
* </ul>
*/
@PostConstruct
private void initGlobalValue() {
log.info("Current: tokenExpiredOfSeconds = {}, allowPasswdRetryTimes = {}, showSqlCommand = {}",
tokenExpiredOfSeconds,
allowPasswdRetryTimes,
showSqlCommand);
String addr = "localhost";
try {
addr = InetAddress.getLocalHost().getHostAddress();
} catch (Exception e) {
log.error("Unable get local ip address: {}", e.getMessage());
} finally {
setGlobalVars(serverProperties.getServlet().getContextPath(),
"http://" + addr + ":" + serverProperties.getPort() + serverProperties.getServlet().getContextPath());
log.info("baseUrl: {}", BASEURL);
}
Locale.setDefault(getDefaultLocale());
}
}