当前位置: 首页 > 知识库问答 >
问题:

SpringBoot不替换Spring Tool Suite版本:3.8.4版本中的系统变量{user.home}

孙项禹
2023-03-14

我使用Spring Initializr生成了一个Spring Bootweb应用程序,使用macOS Sierra中的嵌入式Tomcat+Thymeleaf模板引擎。我想在Mac OS中使用系统变量User Home Folder Name

@Configuration
@Profile("dev")
@PropertySource("file:///{user.home}/.devopsbuddy/application-dev.properties")
public class DevelopmentConfig {

    @Bean
    public EmailService emailService() {
        return new MockEmailService();
    }

}

但我在启动应用程序时出现了这个错误

Caused by: java.io.FileNotFoundException: /{user.home}/.devopsbuddy/application-dev.properties (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.io.FileInputStream.<init>(FileInputStream.java:93)
    at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90)
    at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188)
    at org.springframework.core.io.UrlResource.getInputStream(UrlResource.java:169)
    at org.springframework.core.io.support.EncodedResource.getInputStream(EncodedResource.java:154)
    at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:98)
    at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:72)
    at org.springframework.core.io.support.PropertiesLoaderUtils.loadProperties(PropertiesLoaderUtils.java:58)
    at org.springframework.core.io.support.ResourcePropertySource.<init>(ResourcePropertySource.java:65)
    at org.springframework.core.io.support.DefaultPropertySourceFactory.createPropertySource(DefaultPropertySourceFactory.java:36)
    at org.springframework.context.annotation.ConfigurationClassParser.processPropertySource(ConfigurationClassParser.java:440)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:271)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:190)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:292)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167)
    ... 13 common frames omitted

共有1个答案

雍焱
2023-03-14

@PropertySource最初是作为Spring 3.1的一部分添加的,用于导入资源

在@PropertySource Java文档中指出,

@PropertySource资源位置中存在的任何${…}占位符都将根据已针对环境注册的属性源集进行解析。

@Configuration
@PropertySource(value = "classpath:application.properties")
public class ApplicationConfig {

    // more configuration ...
}
@Configuration
@PropertySource("application.properties")
public class ApplicationConfig {
}
@PropertySource("file:/path/to/application.properties")

或者您可以使用

@PropertySource("file:${CONF_DIR}/application.properties")
$ echo $CONF_DIR
/path/to/directory/with/app/config/files

在您的情况下,您必须使用`

@PropertySource(“文件:${user.home}/application.properties”)

 $ echo $user.home
 /home/yourusername

第一个新功能:

它处理丢失的文件。默认情况下,如果Spring没有找到已经声明的文件,它将抛出一个异常。

@PropertySource(value = "missing.properties", ignoreResourceNotFound = true)

如果不使用IgnoreResourceNotFound=true,它将给出以下错误。

java.lang.IllegalStateException: Failed to load ApplicationContext
[...]
Caused by: java.io.FileNotFoundException: class path resource [missing.properties] cannot be opened because it does not exist.
@PropertySources({
    @PropertySource("default.properties"),
    @PropertySource("overriding.properties")
})

把它放在一起

总而言之,属性源配置可以实现如下:

@Configuration
@PropertySources({
    @PropertySource("default.properties"),
    @PropertySource(value = "file:${CONF_DIR}/optional-override.properties", ignoreResourceNotFound = true)
}
public class ApplicationConfig {
}

在Java 8中

@Manufactures({
@Manufacturer(name =”BMW”),
@Manufacturer(name = “Range Rover”)

})
public class Car{
//code goes in here
}
@Manufacturer(name = “BMW”)
@Manufacturer(name= “Range Rover”)
public class Car{
//code goes in here
}

所有的功劳都归于马蒂亚斯·塞弗森

  1. Spring@PropertySource
  2. Java 8重复注释5分钟解释
 类似资料:
  • 0.00 (1991.2-4?) 两个进程分别显示AAA BBB 0.01 (1991.9?)第一个正式向外公布的Linux 内核版本。 0.02 (1991.10.5)该版本以及0.03 版是内部版本,目前已经无法找到。 0.03 (1991.10.5) 0.10 (1991.10)由Ted Ts'o 发布的Linux 内核版本。 0.11 (1991.12.8)基本可以正常运行的内核版本。 0

  • 获取系统版本信息 参数说明 字段 类型 必须? 说明 deviceId String 是 设备Id completion 是 结果回调 接口定义 Swift: RokidMobileSDK.device.getVersion(deviceId: String, completion: @escaping (_ error: Error?, _ versionInfo: RKDeviceVersio

  • 获取系统版本信息 接口说明 获取当前设备的系统版本信息 返回的消息将以Event的形式向上抛。 返回值 只表示 获取系统版本信息是否已经发送成功。 参数说明 字段 类型 必须? 说明 deviceId String 是 设备ID 示例代码: Kotlin RokidMobileSDK.device.getVersionInfo(deviceId, object : IChannelPublishC

  • Interpreter # platform_python.py import platform print('Version :', platform.python_version()) print('Version tuple:', platform.python_version_tuple()) print('Compiler :', platform.python_co

  • 问题内容: 我怎样才能做到这一点? 它将替换为文本。但是我想用变量的内容替换它。 我尝试过 它也不起作用。 问题答案: 您需要使用双引号: 您的单引号可防止将shell变量替换为其内容。

  • 只能搜到一些早期的,官方文档似乎都没对应关系的表格之类的