gpt4 book ai didi

java - 如何根据现场可用性注入(inject)应用程序、属性值?

转载 作者:行者123 更新时间:2023-12-02 11:01:09 25 4
gpt4 key购买 nike

我正在开发一个 Spring Boot 应用程序。在此应用程序中,我使用以下代码创建了 application.properties 作为 spring bean

场景 1

应用程序属性

http.port =8080

ApplicationPropertyHandler

@PropertySource("config/application.properties")
@Component
public class ApplicationPropertyHandler
{
@Value("${http.port}")
private String nonSecurePort;

@Value("${https.port}" required=false)
private String securePort;

@Value("${server.servlet.context-path}")
private String contextPath;

@Value("${security.key}")
private String securityKey;


}

场景 2

当我保护应用程序https.port时,将写入application.properties

应用程序属性

http.port =8080
https.port=8081

ApplicationPropertyHandler

@PropertySource("config/application.properties")
@Component
public class ApplicationPropertyHandler
{
@Value("${http.port}")
private String nonSecurePort;

@Value("${https.port}" required=false)
private String securePort;

@Value("${server.servlet.context-path}")
private String contextPath;

@Value("${security.key}")
private String securityKey;

场景 1:我遇到以下异常

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ApplicationPropertyHandler': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'https.port' in value "${https.port}"

是否可以在 application.properties 中没有 https.port 字段的情况下运行场景 1?

最佳答案

我认为真正的问题是你如何处理该 ApplicationPropertyHandler?

一种可能的解决方案是根本不使用值,它没有出现在答案中,所以我将其添加到此处。

所以,根据你的问题:

  • 你有 Spring Boot
  • 您使用配置维护 application.properties 文件

但是随后您自己完成所有映射(将每个属性映射到值)。

不要使用 @Value (它确实有默认值,您可以像我们的许多同事所说的那样在冒号“:”后指定)考虑使用内置的 Spring Boot 功能:


@SpringBootAppplication
@EnableConfigurationProperties(MyConfigurationProperties.class)
public class Main {
public static void main(String [] args){...}
}

@ConfigurationProperties
public class MyConfigurationProperties {


public static class Http {
private int port = 8080; // getters/setters, 0 is a default
}

public static class Https {
private int port = 0; // getters/setters, 0 is a default
}

....
}

这允许:

  • 调试(您可以放置​​一个断点并查看该属性实际发生了什么)
  • 在 IDE 中编辑 application.properties 文件时自动完成(如果您向 maven/gradle 添加特殊依赖项)
  • 轻松指定默认值(无需 SPEL)
  • 宽松的绑定(bind)

在最后一个 Spring Boot 版本中,您可以将其设置为不可变,但我不知道您是否使用的是最后一个版本,因此它超出了答案的范围。

关于java - 如何根据现场可用性注入(inject)应用程序、属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59657541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com