我有一个使用以下代码的类:
@Value(value = "classpath:mail_template.html")
private Resource template;
根据this教程,这将允许我使用template.getInputStream()
从jar文件中的文件获取数据。直到在另一个模块中添加了另一个mail_template.html
为止,此方法才能正常工作。
我的应用程序有一个main_application
,其POM具有其他模块作为依赖项。结构如下:
main_application
|
- modulue_1 (another module)
|
- src/main/java
- src/main/resources
|
- mail_template.html
- modulue_2 (my module)
|
- src/main/java
- src/main/resources
|
- mail_template.html
因此,现在我的课使用的是module_1的mail_template.html
,而不是我的模块内部的课。据我了解,这是正确的行为,因为首先加载了module_1,并且向@Value
注入了它找到的第一个mail_template.html
,但这在我的情况下是不正确的,因为它会覆盖module_2中的资源(以及随后的模块)在module_1中具有相同的名称。
是否可以指定使用当前类(或模块)在src/main/resources
批注的@Value
目录中查找资源?还是我必须在每个模块中唯一地命名每个资源,以免出现此问题?
我尝试了许多不同的“ classpath:”路由,包括:
@Value(value = "classpath:module_2/mail_template.html")
....
@Value(value = "classpath*:mail_template.html")
...
@Value(value = "classpath*:module_2/mail_template.html")
但是所有这些都会导致FileNotFoundException
。
每个模块的组成如下:
Maven POM Project
Maven Java Application
src/main/java
base.package.with.module.name.as.suffix.package
src/main/resources
resource_files_if_needed
如前所述,每个模块在Maven Java应用程序main_application
下都被声明为依赖项,每个Maven Java应用程序都使用带有模块名称后缀的“基本包”。
例如:
// main_application:
package my.main.application
// module_1:
package my.main.application.module1
// module_2:
package my.main.application.module2
使用它是为了让Spring可以在配置文件中使用@Component
来加载带有<context:component-scan base-package="my.main.application" />
批注的类。
答案 0 :(得分:0)
在类路径中只能有一个mail_template.html。对于具有相同包和类名的类也是如此。
我会建议我们在资源目录中使用其他目录名称。
答案 1 :(得分:-1)
我相信,它实际上会跳过classpath
表达式中的@Value
。我认为问题是:
之后的classpath
。 :
中的@Value
引用分隔符来分隔属性键和默认值。
例如,以下代码寻找键project.123.gender
,如果键不可用,则默认返回Male
。
@Value("${project.123.gender:Male}")
您可以尝试以下类似方法吗?我没有测试过,但是看起来可能是一个可能的问题。 (请在开始时注意额外的:
)
@Value(value = ":classpath:mail_template.html")
OR
@Value(value = "${:classpath:mail_template.html"})