无法从 Spring Boot 中的外部属性文件中读取值

Posted

技术标签:

【中文标题】无法从 Spring Boot 中的外部属性文件中读取值【英文标题】:Unable to read values from external property file in Spring Boot 【发布时间】:2018-06-24 00:59:35 【问题描述】:

我有一个正在运行的 Spring Boot 项目。我想从外部属性文件中读取一些特定于环境的属性。

我在启动服务器时提到了配置文件的名称和位置,如下所示:

java -jar AllergiesConditions.jar --spring.config.name=application,metadata --spring.config.location=classpath:/,/APPS/SpringBoot/

属性文件加载成功(因为我尝试在数据源 bean 中记录一个外部键值并成功打印)但是当我尝试使用 @Value 注释访问一个值时 - 它返回 null。

我的测试类如下:

@Component
public class testclass 
    private Logger logger = LogManager.getLogger(testcla.class);

    @Value("$sso.server")
    public String sso;

    public void test()
        logger.info("sso url is: "+sso); //This sso is logged as null
        otherStuff();
    

这个 test() 函数会在服务器运行后调用特定 API 时调用。

外部配置文件 - metadata.properties 包含此变量:

sso.server=1234test

编辑:正如this apparently duplicate question 中所建议的,我还尝试在主应用程序配置类中添加@PropertySource(name = "general-properties", value = "classpath:path to your app.properties"),它加载了文件,但我自己仍然得到空值。

有人可以帮忙解决这里出了什么问题吗?测试类是否需要一些特定的注释或者它需要是一个 bean 或其他东西??

在此先感谢 :)

【问题讨论】:

***.com/questions/44179065/… Spring Boot - set value from an external properties file的可能重复 我尝试了上面帖子中建议的解决方案,仍然无法成功! 它不能是null...如果$sso.server 无法解析,您的应用程序将在启动时中断。这意味着您没有使用托管实例,而是自己创建 testclass 的实例。 @M.Deinum 是的,我认为你提供了一些很好的线索。在我的一个控制器中,我只是打电话给testclass obj = new testclass(); obj.test();。如果那是错误的方法,请告诉我如何在我的控制器中调用我的测试类的测试函数。如您所料,如果我在控制器本身内部使用@Value 注释并将其记录到控制器本身,它可以工作!! 【参考方案1】:

感谢 M.Deinum 的大力投入并节省了我的时间

只是发布他的评论作为答案

其实$sso.server 不能为空。如果$sso.server 无法解析,我的应用程序将在启动时中断。

所以明显的问题是我正在使用

在我的控制器中创建 testclass 的新实例
testclass obj = new testclass(); obj.test();

我应该通过在我的控制器中自动装配 testclass 来使用 Spring 托管实例。

【讨论】:

以上是关于无法从 Spring Boot 中的外部属性文件中读取值的主要内容,如果未能解决你的问题,请参考以下文章

无法从 JUnit 中的 Spring Boot 读取应用程序属性?

“当前目录”中的 Spring Boot 外部属性文件被忽略

使用 Spring Boot 和 Docker 的外部属性文件

如何在 Wildfly 中将外部属性文件加载到 Spring Boot

Spring Boot WS 应用程序无法加载外部属性

Spring Boot - 添加外部属性文件