Spring类路径资源已覆盖

时间:2019-06-05 22:03:54

标签: java spring maven

我有一个使用以下代码的类:

@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" />批注的类。

2 个答案:

答案 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"})