当前位置: 首页 > 知识库问答 >
问题:

在内部设置所有Spring Boot属性。将yml文件转换为系统属性

耿建弼
2023-03-14

我正在处理一个Spring启动项目,其中传递了许多VM参数供应用程序启动,即证书位置、特定配置文件类型(不是dev、qa、prod等)。0/>file.
问题语句
default.yml中设置的属性仅可访问Spring上下文的环境接口,即org.springframework.core.env.环境,并且属性不会自动/默认设置为系统属性。
I
但是我不想使用环境. getProperty(key)显式地调用所有属性,而是希望所有在Spring上下文中可用的属性都应该是循环的/没有循环的
预期的解决方案
我正在寻找一种方法,使用它在listner方法中,我可以将default.yml文件中定义的所有属性设置为系统属性,而无需按其名称访问属性。

下面是我目前遵循的方法,将从Spring环境/default.yml中提取的活动配置文件设置为系统属性。我不想从yml获得活动配置文件或任何属性,但希望. yml中可用的所有属性自动设置到系统中。

Optional.ofNullable(springEnv.getActiveProfiles())
            .ifPresent(activeProfiles -> Stream.of(activeProfiles).findFirst().ifPresent(activeProfile -> {
                String currentProfile = System.getProperty("spring.profiles.active");
                currentProfile = StringUtils.isBlank(currentProfile) ? activeProfile : currentProfile;
                System.setProperty("spring.profiles.active", currentProfile);
            }));

共有1个答案

裴展
2023-03-14

你可以用这样的方式:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Properties;

@Component
public class EnvTest {

    final StandardEnvironment env;

    @Autowired
    public EnvTest(StandardEnvironment env) {
        this.env = env;
    }

    @PostConstruct
    public void setupProperties() {
        for (PropertySource<?> propertySource : env.getPropertySources()) {
            if (propertySource instanceof MapPropertySource) {
                final String propertySourceName = propertySource.getName();
                if (propertySourceName.startsWith("applicationConfig")) {
                    System.out.println("setting sysprops from " + propertySourceName);
                    final Properties sysProperties = System.getProperties();

                    MapPropertySource mapPropertySource = (MapPropertySource) propertySource;
                    for (String key : mapPropertySource.getPropertyNames()) {
                        Object value = mapPropertySource.getProperty(key);
                        System.out.println(key + " -> " + value);
                        sysProperties.put(key, value);
                    }
                }
            }
        }
    }
}

当然,当它对你有效时,请删除标准输出消息

 类似资料:
  • 问题内容: 配置 : Spring 2.5,Junit 4,Log4j 从系统属性中指定log4j文件位置 在运行时,使用-D java选项设置系统属性。一切都很好。 问题/我需要什么: 在单元测试时,未设置系统属性,并且文件位置未解析。 App使用Spring,想简单地配置Spring以 设置 系统属性。 更多信息: 要求仅用于配置。无法引入新的Java代码或IDE中的条目。理想情况下,Spri

  • 问题内容: 使用Gradle执行JUnit 5测试时,我找不到如何设置系统属性。标准任务可以配置如下: 但是,任务似乎没有这种选择。 问题答案: 更新: 请注意,JUnit团队开发的JUnit Platform 1.2中已弃用,而在1.3中不再使用。请在Gradle 4.6或更高版本中切换到Gradle的标准任务。详细信息在这里。 正如我在这里提到的,如果您仍然使用过时的话,可以像这样设置系统属性

  • 问题内容: 我们正在使用类似于系统规则的方法来处理JUnit 4测试中的(系统)属性。这样做的主要原因是每次测试后都要清理环境,以便其他测试不会无意间依赖于可能的副作用。 由于JUnit 5已发布,所以我想知道是否存在“ JUnit 5方法”吗? 问题答案: 有JUnit 5 Pioneer,一个“ JUnit 5扩展包”。它带有和。从文档: 的和注释可用于清除,分别为测试执行系统设置属性的值。这

  • 问题内容: 我在这里跟随有关JAAS身份验证的教程,当它显示如何运行示例代码时,说应该使用Java启动器的标准选项- Djava.security.auth.login.config ==启动已编译的类。 sample_jaas.config。这样,将设置系统属性: 我是用这种方式完成的,但是现在我也想在NetBeans中运行代码。由于NetBeans使用Ant,因此我认为指定这些选项可能有所不同

  • 作为一个简化的例子,考虑这个有两个字段的表。一个是字符串,另一个是XML。 Source=“MediaConversions” 现在我想查询该表,并将结果作为json,但也要一次性将XML转换为json。 导致 [{"Source":"媒体转换","OrderParameter":" 但我想把它转换成: [{"Source":"MediaConversion","OrderParameter":{

  • 我已经建立了一个管道,在microsoft azure管道中运行我的测试。在我的本地机器上,这工作正常,文件位于我的计算机上的gradle系统目录中: 这是我的: 据我所知,由jetifier从文件。 输出: 下面是我组装调试和测试单元测试的azure-pipelines.yml的一部分: 我在这篇文章、这篇文章和这篇文章中尝试了解决方案,但没有结果。jar文件大4mb,是代码存储库中唯一的文件,