1024创新实验室-公告

助力抖音1000个粉丝,开播写代码🎉🎉

打开【抖音APP】-点击【左上角侧边栏】-【点击扫一扫】-【进行关注】🎉🎉

和1024创新实验室一起,热爱代码,热爱生活,永远年轻,永远前行🎉🎉


Skip to content

系统环境

一、问题与背景

当java进程运行的时候,希望了解到当前处于什么环境? 开发还是测试、还是生产等等,因为需要在不同的环境做一些不同的操作,举个最简单例子,如果接口报错的话,开发环境中、测试环境中 可以在接口中返回 java的异常报错信息,这样在开发、测试阶段可以直接定位到问题。

二、架构与思想

想要实现在运行的时候知道是什么环境,那么肯定需要在启动的时候,将 环境信息 注入或者传入 到java项目中。
根据的项目结构,清楚的知道 用的是 maven profile 来实现的多环境问题。
那么完全可以利用这一点来去做。

三、具体使用

3.1、配置

sa-admin项目的 application.yaml 中 有如下配置:

yaml
spring:
  profiles:
    active: '@profiles.active@'

这个地方不需要修改, 他回自动将 maven package -P xxx 打包命令的 profile 注入进来

3.2、代码中使用

在需要判断环境的地方,直接注入变量:

java
    @Autowired
    private SystemEnvironment systemEnvironment;

具体方法如下:

java
systemEnvironment.isProd(); // 是否为 生产 环境
systemEnvironment.getProjectName(); // 获取 项目 名称
systemEnvironment.getCurrentEnvironment(); // 获取当前项目环境, 返回 一个枚举: SystemEnvironmentEnum

使用举例,如果是生产环境,则只是提示参数错误,如果不是生产环境,则将 Exception 返回给前端:

java
    /**
     * 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格式错误");
    }

四、实现原理

使用 @Configuration 进行配置,具体配置类如下:SystemEnvironmentConfig.java;
该类在项目启动的时候,会进行环境匹配判断,如果没有配置的,项目无法启动,具体请看如下代码:

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);
    }
}

联系我们

1024创新实验室-主任:卓大,混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室 致力于成为中原领先、国内一流的技术团队, 以AI+数字化为驱动,用技术为产业互联网提供无限可能, 业务如下:
  • 教育领域(高职院校数字化、就业创业大数据平台、继续教育平台;在线教育系统、视频直播、题库等,包含:医学、应急管理、成考、专升本等)
  • 供应链领域(网络货运平台、大宗贸易进销存ERP、物流管理TMS、B2B电商、仓储WMS、AI提效等)
  • 中医领域(诊所数字化管理、互联网医院、AI辅助诊疗、中医适宜技术、在线云问诊、空中药房等)
  • AI+软件领域(软件定制外包、开源技术、数据大屏、国产化改造、技术升级换代、人员外包、技术顾问、技术培训等)
加微信: 卓大
拉你入群,一起学习
公众号 :六边形工程师
分享:赚钱、代码、生活
请 “1024创新实验室”
烩面里加肉
咖啡配胡辣汤,提神又饱腹
抖音 : 六边形工程师
直播:赚钱、代码、中医