【问题标题】:Micronaut FunctionInitializer override application propertiesMicronaut FunctionInitializer 覆盖应用程序属性
【发布时间】:2020-08-04 11:21:32
【问题描述】:
@Singleton
public class TestFunction extends FunctionInitializer {
    Logger log = LoggerFactory.getLogger(TestFunction.class);

    public TestFunction() {
    }

    public String execute() {
        return "Hello";
    }

}

我想以编程方式覆盖 application.yml 文件中的数据源属性,但不使用 bean 创建的事件侦听器。有没有办法做到这一点。就像使用属性创建自定义应用程序上下文一样。

我已将以下方法用于 Micronaut API 网关代理。

public class StreamLambdaHandler implements RequestStreamHandler {
.......
public StreamLambdaHandler() {
        try {
            log.info("Initializing Lambda Container");
            this.dbCredentialService = new DBCredentialService();
            // Get updated database credential map
            Map<String, Object> props = this.dbCredentialService.getDbCredential();
            // Create application context builder with updated properties
            // i.e Override datasources properties in application.yml
            builder = ApplicationContext.build().properties(props);
            handler = new MicronautLambdaContainerHandler(builder);
      }....
    ........
}

我们可以用 FunctionInitializer 做类似的事情吗?

【问题讨论】:

  • “我想以编程方式覆盖 application.yml 文件中的数据源属性...” - 您想从哪里获取覆盖application.yml 中定义的值的新值?了解信息的来源将有助于确定一个好的解决方案。
  • 我相信你需要工厂来告诉bean它是如何创建的docs.micronaut.io/latest/api/io/micronaut/context/annotation/…你能提供一个更准确的例子你计划覆盖什么吗?
  • “我相信你需要一个工厂来告诉bean它是如何创建的” - 你不一定需要一个工厂来告诉bean它是如何创建的。有许多方法可以覆盖原本来自 application.yml 的值。在运行时了解数据的来源将有助于确定一个好的解决方案。
  • @JeffScottBrown 嗨,我想从 Secrets Manager 获取数据库凭据并将其用于 Hibernate/Hikari。
  • @Traycho Ivanov 正如前面评论中提到的,我必须从 AWS 机密管理器中读取一些机密值并使用它来引导 Hibernate。

标签: java aws-lambda micronaut micronaut-aws


【解决方案1】:

如果您打算仅覆盖数据源凭据属性,则可以这样做。

@Factory
public class HikariDataSourceFactory {

    @Bean
    @Primary
    public DataSource dataSource(DBCredentialService credentialService) throws URISyntaxException {

        Map<String, Object> credentials = this.dbCredentialService.getDbCredential();
        String username = "user";
        String password = credentials.get("username");  
        
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:postgresql://localhost:5432/postgres");
        config.setUsername(username);
        config.setPassword(password);
        config.setDriverClassName("org.postgresql.Driver");

        return new HikariUrlDataSource(config);
    }
}

【讨论】:

  • 这很有帮助。有没有办法只覆盖一些属性(比如密码),而其他属性是从 application.yml 本身读取的?或者在更广泛的范围内,不仅是数据源属性,而且覆盖 application.yml 中的属性子集
  • @SujithCP 您可以拥有自己的PropertySourceLoader,检查扩展AbstractPropertySourceLoader 并定义顺序,以便它具有您预期的优先级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2019-03-02
  • 1970-01-01
  • 2013-07-19
  • 2017-04-07
相关资源
最近更新 更多