gpt4 book ai didi

java - 使用类路径时,在 Java Spring 中哪里设置 application.yml 的源;当前使用子模块

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

我有一个项目,其中包含一些主要源代码(读取配置和启动监听器以启动多个服务)和多个子模块。主项目和子模块中都有资源文件夹。目前,我必须将 application.yml 存储在子模块之一中;我的主要源资源中的 application.yml 被忽略。

项目结构:

-Main
-SubModule1
-Submodule2
-main
-resources
-config
-application.yml_
-Submodule3
-MainSourceCode (including the submodules)
-main
-resources
-config
-application.yml

备注:

  • 整个项目的名称曾经是Submodule2的名称(因此,可能会有一些剩余的配置)

  • 如果我将 Submodule2 中的 application.yml_ 重命名为 application.yml,一切正常

这就是我读取配置的方式:

@Configuration
@Order(100)
@PropertySources({
@PropertySource(value = "file:../../../../../resources/config/application.yml", ignoreResourceNotFound = true),
@PropertySource("classpath:/config/application.yml")
})
public class AuthorizationControllerConfiguration {
...

我收到输出:

2019-08-28 08:49:58.054  INFO 19812 --- [           main] o.s.c.a.ConfigurationClassParser         : Properties location [file:../../../../../resources/config/application.yml] not resolvable: ..\..\..\..\..\resources\config\application.yml (System cannot find file)
2019-08-28 08:49:58.054 WARN 19812 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [de.......AuthorizationControllerConfiguration]; nested exception is java.io.FileNotFoundException: class path resource [config/application.yml] cannot be opened because it does not exist

Config1 按预期被忽略,Config2 - 不管怎样 - 从 SubModule2 读取,而不是从主模块读取

所以,基本上我的程序(从 IntelliJ 运行)从错误的源中选择。

我必须在哪里查看才能更改“类路径”的来源?

最佳答案

不幸的是,@PropertySources 注释不适用于开箱即用的 YML 文件,请参阅此 blog

要解决此问题,您需要添加自定义 PropertySourceFactory。

此外,来自前面提到的博客文章:

public class YamlPropertySourceFactory implements PropertySourceFactory {

@Override
public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource) throws IOException {
Properties propertiesFromYaml = loadYamlIntoProperties(resource);
String sourceName = name != null ? name : resource.getResource().getFilename();
return new PropertiesPropertySource(sourceName, propertiesFromYaml);
}

private Properties loadYamlIntoProperties(EncodedResource resource) throws FileNotFoundException {
try {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();
return factory.getObject();
} catch (IllegalStateException e) {
// for ignoreResourceNotFound
Throwable cause = e.getCause();
if (cause instanceof FileNotFoundException)
throw (FileNotFoundException) e.getCause();
throw e;
}
}
}

这应该可以解决问题。

关于java - 使用类路径时,在 Java Spring 中哪里设置 application.yml 的源;当前使用子模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57686804/

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