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

PropertiesFactoryBean可以从Application.yml读取值吗?

曾航
2023-03-14

我的项目有一个依赖项,它需要一个可以由@value注释读取的set a properties对象:

@Value("#{myProps['property.1']}")

为了在JavaConfig中实现这一点,我使用了以下内容:

@Bean(name="myProps")
public static PropertiesFactoryBean mapper() {
    PropertiesFactoryBean bean = new PropertiesFactoryBean();
    bean.setLocation(new ClassPathResource("myprops.properties"));
    return bean;
}
property.1=http://localhost/foo/bar
property.2=http://localhost/bar/baz
property.3=http://localhost/foo/baz
myprops.properties:
    property.1=${base.url}/foo/bar
    property.2=${base.url}/bar/baz
    property.3=${base.url}/foo/baz
application.yml:

    base:
      url: http://localhost

    ---
    spring:
      profiles: staging
    base:
      url: http://staging

    ---
    spring:
      profiles: production
    base:
      url: http://production
@Configuration
public class DefaultConfiguration {

    @Bean(name="myProps")
    public static PropertiesFactoryBean mapper() {
        PropertiesFactoryBean bean = new PropertiesFactoryBean();
        bean.setLocation(new ClassPathResource("myprops.properties"));
        return bean;
    }
}

@Configuration
@Profile("staging")
public class StagingConfiguration {

    @Bean(name="myProps")
    public static PropertiesFactoryBean mapper() {
        PropertiesFactoryBean bean = new PropertiesFactoryBean();
        bean.setLocation(new ClassPathResource("myprops-staging.properties"));
        return bean;
    }
}

@Configuration
@Profile("production")
public class ProductionConfiguration {

    @Bean(name="myProps")
    public static PropertiesFactoryBean mapper() {
        PropertiesFactoryBean bean = new PropertiesFactoryBean();
        bean.setLocation(new ClassPathResource("myprops-production.properties"));
        return bean;
    }
}

是否可以将我的PropertiesFactoryBean配置为从Application.yml读取值?如果没有,是否有更简单的方法来使用JavaConfig配置属性?

共有1个答案

公西俊才
2023-03-14

我最后以编程方式完成了这一操作,它给出了我所要寻找的行为:

@Value("${base.url}")
private String baseUrl;

@Bean(name = "myProps")
public PropertiesFactoryBean mapper() throws IOException {
    PropertiesFactoryBean bean = new PropertiesFactoryBean();
    bean.setLocation(new ClassPathResource("myprops.properties"));
    bean.afterPropertiesSet();

    // replace ${base.url} in values
    Properties props = bean.getObject();
    Enumeration names = props.propertyNames();

    while (names.hasMoreElements()) {
        String name = names.nextElement().toString();
        String value = props.getProperty(name);
        if (value.contains("${base.url}")) {
            props.setProperty(name, value.replace("${base.url}", baseUrl));
        }
    }

    bean.setLocalOverride(true);
    bean.setProperties(props);
    bean.afterPropertiesSet();

    if (log.isDebugEnabled()) {
        log.debug("Base URL: " + baseUrl);
    }

    return bean;
}
 类似资料:
  • 我的logback-spring.xml从application.properties中读取正常,但从application.yml中读取不正常。在我的项目中,我们被要求仅使用YAML格式,因为该格式正在同一项目中的其他微服务中使用,所以我无法添加属性文件。请帮助我为什么我的application.yml在logback.xml中没有被读取 我尝试了各种方法,并在stackoverflow上搜索了

  • 我正在尝试从Java应用程序的Google Sheets API。我已经访问了教程中提到的文件,但我无法访问我自己创建的任何文件。 这是我使用的代码: 我在Drive中手动创建了一个电子表格,用字符串填充A1: B,并从URL中复制了id,看起来像“1IeoY5jY3Su86x1uvgc1yJqEU-6dd6FdUKo8Yf5J73k”(不是实际的ID)。 这将生成错误400无法解析范围:类数据!

  • 我创建了一个带有indexName属性的可索引注释,这个注释必须放在类的顶部,我想为application.yml文件中定义的indexName添加一个前缀

  • 我想从Java程序接收Arduino Uno上的多个字节。arduino在收到数据后立即处理数据,因此我不需要存储它,我使用串行RX缓冲区作为临时存储,直到我实际读取字节为止。完全实现后,每次将发送大约150个字节,但我已经修改了缓冲区大小来解决这个问题。我使用jSerialComm作为java的串行库 我在下面放了一些arduino和java代码。当我从IDE的串行监视器发送字节,按预期点亮le

  • 问题内容: 我已经使用Python多处理模块在Monte Carlo代码中实现了一些简单的并行性。我有看起来像的代码: 但是,当我查看结果列表时,似乎蒙特卡洛迭代器尚未启动。我知道它们有,因为我可以让这些过程在蒙特卡洛步骤中打印出信息。所以我在做些愚蠢的事情。我以为job.join()会阻止结果列表被构建,直到一切运行完毕,因此mc.results字段将被更新。 我意识到我还没有告诉您我的Mont

  • 问题内容: 具体来说,问题是编写这样的方法: 如果数据在“超时”毫秒内可用,则返回值与in.read()相同,否则为-2。在方法返回之前,所有产生的线程必须退出。 为避免自变量,此处的主题为java.io.InputStream,如Sun(任何Java版本)所记录。请注意,这并不像看起来那么简单。以下是Sun的文档直接支持的一些事实。 in.read()方法可能是不可中断的。 将InputStre