Java Spring引导,从application.yaml读取的路径类型属性
我希望有人能够帮助我解决我在SpringBootVersion2.3.5中发现的以下问题 我有一个简单的测试应用程序(无法共享源),其中:Java Spring引导,从application.yaml读取的路径类型属性,java,spring,spring-boot,spring-properties,Java,Spring,Spring Boot,Spring Properties,我希望有人能够帮助我解决我在SpringBootVersion2.3.5中发现的以下问题 我有一个简单的测试应用程序(无法共享源),其中: 我有一个用@ConfigurationProperties(prefix=“app”)注释的类和一个字段私有路径 application.yaml文件已配置值path:C:\\Local 在应用程序启动期间,应将application.yaml中配置的属性值打印到控制台。 因此,我有以下行为: 当我从IntelliJ(Windows机器)运行应用程序时
- 我有一个用
注释的类和一个字段@ConfigurationProperties(prefix=“app”)
私有路径
文件已配置值application.yaml
path:C:\\Local
application.yaml
中配置的属性值打印到控制台。
因此,我有以下行为:
- 当我从IntelliJ(Windows机器)运行应用程序时,它运行正常
- 当我构建胖jar(使用Maven-Spring引导插件)并运行应用程序时,它失败了
- 当同一个jar在Linux下运行时,配置了Linux路径后,它工作正常
@SpringBootApplication
public class ApplicationBootstrap implements ApplicationRunner {
@Autowired private ApplicationProperties properties;
@Override public void run(final ApplicationArguments args) {
System.out.println(properties.getPath());
}
public static void main(String[] args) {
SpringApplication.run(ApplicationBootstrap.class);
}
}
更新
看来问题出在类路径加载器中
该问题出现在第100行的org.springframework.beans.propertyeditors.PathEditor
中
else if (!resource.exists() && nioPathCandidate)
在IntellJ下运行时,使用ClassLoaders$AppClassLoader
,这个可以解析值C:\\Local
从jar运行时,使用launchDurlClassLoader
,当使用相同的值执行第100行时失败,异常消息java.lang.IllegalArgumentException:name
因此,最有可能的问题是在Spring引导类加载程序中
更新
问题出现在LaunchedURLClassLoader
的方法findResource()
中,该方法将相同的方法委托给URLClassLoader
,而AppClassLoader
(从IntellJ运行时使用)将相同的方法委托给buildinclassloader
最终答案
问题是,在某一点上,它将c:
视为协议,并出现异常而失败
因此,属性文件中的正确配置应该是:app.path=file:C:\\Local
相关问题:
谢谢。首先,您的申请文件扩展名应为“yml”。 你能提供你的申请表吗? 以下示例适用于我:
@Component
@ConfigurationProperties(prefix = "app")
public class TestConfig {
private Path path;
public Path getPath() {
return path;
}
public void setPath(Path path) {
this.path = path;
}
}
和应用
app:
path: C:\FOO\BAR
IDEA是否使用与从CLI启动FatJar时相同的系统范围JRE,或者它们不同?是相同的JDKThank for“.yaml”,这是一个错误,我修复了它,但仍然遇到相同的问题。properties类看起来与您的类相同,并且
application.yml
也一样。您可以提供您尝试在控制台中打印值的类吗?更新了该类的问题。是否在ApplicationProperties类中使用以下导入:import java.nio.file.Path?您使用的是什么版本的Java?
app:
path: C:\FOO\BAR