【问题标题】:How to make calculated property in configuration file如何在配置文件中创建计算属性
【发布时间】:2017-03-18 09:03:43
【问题描述】:

我有一个 spring-boot 应用程序。我想我需要覆盖 bean 属性,因为我想在应用程序启动之前创建计算属性。 在我的 YAML 配置文件中

#this property needs to be calculated
myport:
  port: 123
server:
  port: ${myport.port}

但是,在应用程序启动后 server.port 属性值 123 但我不想要这个值,我想要 myport用特殊方法计算的值。

我尝试编写bean(如下所示),但它也不起作用。它应该设置为 9999,而不是 123。

@ConfigurationProperties(prefix = "myport", ignoreUnknownFields = true)
public class ServerPortConfigurationBean extends ServerProperties {

    @Override
    public Integer getPort() {
        return super.getPort();
    }

    @Override
    public void setPort(Integer port) {
        super.setPort(9999);
    }
}

【问题讨论】:

  • 如何启动 Spring-Boot 服务器? Maven 或 Gradle 或任何其他方式?
  • 我用 gradle bootRun 运行应用程序
  • 您的端口需要特殊的计算逻辑,还是只想为您的实例使用随机可用端口?对于后者,只需设置属性 server.port=0,然后 Spring Boot 会随机取一个可用端口。

标签: java spring spring-boot properties configuration


【解决方案1】:

如果要更改服务器的端口,需要在服务器启动前提供该属性。

将您的 application.yml 更改为:

server:
  port: ${myport}

您使用等级,因此您可以通过 processResources 任务提供属性,如下所示:

task calculateServerPort {
  // calculate your port here
  // if you really need business logic in Java for calculation, you could use the javaExec task in here
  project.ext.myport = 8007 // make it available as project.property here
}

processResources {
  dependsOn(calculateServerPort)
  expand project.properties
}

bootRun {
    addResources = false
}

请注意,将bootRunaddResources 属性设置为false 会导致您的资源从项目的静态构建目录中加载。但无论如何,必须让 Spring-Boot 的资源处理工作。

如果您需要有关如何捕获 Java 任务结果(与 javaExec 一起使用)的更多信息,您可以找到 here

如果您需要 Java 中的业务逻辑来计算您的端口(以及最重量级的端口),最后一个选择当然是提供自定义等级插件。

【讨论】:

  • 我同意这个方案,但是我希望计算的端口值是可用端口socket = new ServerSocket(0);socket.setReuseAddress(true);int port = socket.getLocalPort();return port;
  • 因此您可以编写一个 Java 类来执行您的代码。像提供的链接中描述的那样捕获输出。最后但并非最不重要的一点是将输出分配给属性变量,您应该完成了。
猜你喜欢
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
相关资源
最近更新 更多