# 一、问题与背景
当java进程运行的时候,我们希望了解到当前处于什么环境? 开发还是测试、还是生产等等,因为我们需要在不同的环境做一些不同的操作,举个最简单例子,如果接口报错的话,开发环境中、测试环境中 可以在接口中返回 java的异常报错信息,这样我们在开发、测试阶段可以直接定位到问题。
# 二、架构与思想
想要实现在运行的时候知道是什么环境,那么肯定需要在启动的时候,将 环境信息 注入或者传入 到java项目中。
根据我们的项目结构,我们清楚的知道 我们用的是 maven profile
来实现的多环境问题。
那么我们完全可以利用这一点来去做。
# 三、具体使用
# 3.1、配置
在 sa-admin
项目的 application.yaml
中 有如下配置:
spring:
profiles:
active: '@profiles.active@'
2
3
这个地方不需要修改, 他回自动将 maven package -P xxx
打包命令的 profile
注入进来
# 3.2、代码中使用
在需要判断环境的地方,直接注入变量:
@Autowired
private SystemEnvironment systemEnvironment;
2
具体方法如下:
systemEnvironment.isProd(); // 是否为 生产 环境
systemEnvironment.getProjectName(); // 获取 项目 名称
systemEnvironment.getCurrentEnvironment(); // 获取当前项目环境, 返回 一个枚举: SystemEnvironmentEnum
2
3
使用举例,如果是生产环境,则只是提示参数错误,如果不是生产环境,则将 Exception 返回给前端:
/**
* json 格式错误 缺少请求体
*/
@ResponseBody
@ExceptionHandler({HttpMessageNotReadableException.class})
public ResponseDTO<?> jsonFormatExceptionHandler(Exception e) {
if (!systemEnvironment.isProd()) {
log.error("全局JSON格式错误异常,URL:{}", getCurrentRequestUrl(), e);
}
return ResponseDTO.error(UserErrorCode.PARAM_ERROR, "参数JSON格式错误");
}
2
3
4
5
6
7
8
9
10
11
12
# 四、实现原理
使用 @Configuration
进行配置,具体配置类如下:SystemEnvironmentConfig.java
;
该类在项目启动的时候,会进行环境匹配判断,如果没有配置的,项目无法启动,具体请看如下代码:
@Configuration
public class SystemEnvironmentConfig implements Condition {
@Value("${spring.profiles.active}")
private String systemEnvironment;
@Value("${project.name}")
private String projectName;
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
String property = conditionContext.getEnvironment().getProperty("spring.profiles.active");
return StringUtils.isNotBlank(property) && !SystemEnvironmentEnum.PROD.equalsValue(property);
}
@Bean
public SystemEnvironment initEnvironment() {
SystemEnvironmentEnum currentEnvironment = SmartEnumUtil.getEnumByValue(systemEnvironment, SystemEnvironmentEnum.class);
if (currentEnvironment == null) {
throw new ExceptionInInitializerError("无法获取当前环境!请在 application.yaml 配置参数:spring.profiles.active");
}
if (StringUtils.isBlank(projectName)) {
throw new ExceptionInInitializerError("无法获取当前项目名称!请在 application.yaml 配置参数:project.name");
}
return new SystemEnvironment(currentEnvironment == SystemEnvironmentEnum.PROD, projectName, currentEnvironment);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 联系我们
1024创新实验室-主任:卓大 (opens new window),混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室(河南·洛阳) (opens new window) 致力于成为中原领先、国内一流的技术团队,以技术创新为驱动,合作各类项目(软件外包、技术顾问、培训等等)。
![]() | ![]() | ![]() |
加 主任 “卓大” 微信 拉你入群,一起学习 | 关注 “小镇程序员” 分享代码与生活、技术与赚钱 | 请 “1024创新实验室” 喝咖啡 支持我们的开源与分享 |