【问题标题】:Spring Boot - external property not foundSpring Boot - 未找到外部属性
【发布时间】:2015-08-15 13:40:26
【问题描述】:

我的应用程序正在尝试将所有项目属性外部化,其中一些将在我的应用程序中,而另一些将在 Windows 的某个文件夹中。

我设置 Spring 以这种方式执行:--spring.config.location=file:///C:\Temp\config\application.properties,classpath:application.properties

如您所见,如果双方存在相同的属性,应用程序属性将被保留(优先顺序)。例如,我注意到如果存在于文件夹 (file://) 之外,可以找到一些属性,例如“server.port”,但如果我创建一个这样的“common.acronym-name”,我的项目将找不到它的值。

为什么“server.port”的行为与我创建的不同?是否有任何配置需要告诉 Spring Boot 在我的项目中查看这个外部属性?

@Value("${common.acronym-name:}") //Just find it in application classpath
private String acronymEnv;

谢谢!

【问题讨论】:

  • 我无法重现这一点,一切似乎都符合预期。类路径属性文件中的值覆盖外部文件属性,如果不存在要覆盖的值,则使用外部值。 common.acronym-name 的行为与 server,port 的行为相同。您的设置中一定有一些您没有显示的内容对您所看到的内容负责。也许创建一个mcve
  • 我注意到属性的顺序对外部文件有影响,对 Spring Boot 有什么要求吗?我注意到如果我的类路径中只有一个 application.prop ,则顺序不会影响。
  • 不,我也无法重现。
  • 请尝试创建一个类来获取“spring.main.show-banner”属性值,如下面的示例。
  • 我注意到 Spring Boot 无法正确读取外部属性,如果我尝试仅读取外部属性,横幅仍会显示在顶部。 java -jar sample-1.2.3.RELEASE.jar -Dspring.config.location=file:///C:\Temp\config\application.properties

标签: spring web spring-boot


【解决方案1】:

要模拟这个错误,只需创建一个类来处理横幅,例如:

@Component
public class ShowBanner {

    @Value("${spring.main.show-banner:}")
    private String showBanner;

    @PostConstruct
    public void init() {
        System.out.println(showBanner);
    }
}

在此代码中,如果您在外部属性文件中设置属性“spring.main.show-banner=false”,如果在服务器部分之前设置横幅,横幅仍会显示在控制台中。当横幅不应该出现时。因为属性返回空。

如果我在服务器部分之后移动属性,则横幅会消失,因为按预期返回 false 值。

请记住,我的 application.properties 项目是空的。

顺便说一句,即使通过 Eclipse 或 java 控制台运行,它也会发生: java -jar sample-1.2.3.RELEASE.jar --spring.config.location=file:///C:\Temp\config\application.properties,application.properties

为什么?

【讨论】:

  • 我也试过这个。横幅不显示,println() 打印false,无论我将属性放在外部属性文件的第一行还是最后一行。这里发生了一些奇怪的事情。
  • 我同意.. 另一个属性也有同样的行为,我只是告诉你 show-banner 来演示发生了什么......
【解决方案2】:

信不信由你,属性的顺序会影响外部属性的查找。

如果我将其设置为“spring.main.show_banner”是顶部的第一个,则无法找到我的属性。例如:

spring.main.show-banner=false
server.port=9043
server.session-timeout=1800
server.ssl.key-store=file:///C:/Temp/config/localhost.jks
server.ssl.key-store-password=localhost
server.ssl.key-password=localhost

所以,如果更改为以下顺序,一切正常:

server.port=9043
server.session-timeout=1800
server.ssl.key-store=file:///C:/Temp/config/localhost.jks
server.ssl.key-store-password=localhost
server.ssl.key-password=localhost
spring.main.show-banner=false

有什么原因吗? Spring Boot 需要按正确的顺序排列属性吗?似乎“服务器”部分必须是属性中的第一个。

谢谢。

【讨论】:

  • 不,我根本无法重现。在这里一切正常,按照这里指定的顺序。您能否创建一个显示此行为的mcve 并在此处发布整个内容。您的设置中没有发布的某些内容导致了这种情况,这是不正常的。这样做时,您甚至可能会发现自己是什么。
猜你喜欢
  • 2018-06-25
  • 2018-02-25
  • 1970-01-01
  • 2020-07-30
  • 2019-06-12
  • 2018-02-21
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多