Spring启动时没有加载PropertySourceLoader

时间:2015-08-05 06:09:09

标签: spring-boot jasypt

使用Spring引导版本1.2.3(也使用1.2.5进行测试),我跟随creating-a-custom-jasypt-propertysource-in-springbootSpring Boot & Jasypt easy: Keep your sensitive properties encrypted使用自定义PropertySourceLoader来使用jsypt库。我的源加载器类在api.jar中,这个jar文件包含在myapplication.war文件中。这场战争部署在tomcat。

Spring似乎没有在应用程序启动时加载EncryptedPropertySourceLoader。有人可以帮忙吗?

以下是我的项目结构和相关代码。

Project - api.jar
    | src
    | | main
    |   | java
    |     | EncryptedPropertySourceLoader.java
    |   | resources
    |     | META-INF
    |       | spring.factories

api.jar是使用api.jar!META-INF/spring.factories构建的。

package com.test.boot.env;

import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.env.PropertySourceLoader;
import org.springframework.core.PriorityOrdered;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.Resource;

public class EncryptedPropertySourceLoader implements PropertySourceLoader, PriorityOrdered {

    private static final Logger logger = LoggerFactory.getLogger(EncryptedPropertySourceLoader.class);


    public EncryptedPropertySourceLoader() {
        logger.error("\n\n\n***CREATING properties loader.\n\n\n");
    }

    @Override
    public String[] getFileExtensions() {
        return new String[] { "properties" };
    }

    @Override
    public PropertySource<?> load(final String name, final Resource resource, final String profile) throws IOException {
        logger.error("\n\n\n***Loading properties files.\n\n\n");

        if (true) {
            throw new RuntimeException("calling load"); \\intentional to identify the call
        }
        return null;
    }

    @Override
    public int getOrder() {
        return HIGHEST_PRECEDENCE;
    }
}

spring.factories内容

org.springframework.boot.env.PropertySourceLoader=\
com.test.boot.env.EncryptedPropertySourceLoader

我也试过没有'\',但它没有任何区别。

以下是spring.factories文件

myapplication.war的路径
myapplication.war!WEB-INF/lib/api.jar!META-INF/spring.factories

根据我的理解,我应该在启动时看到RuntimeException,但我的应用程序已成功启动。任何人都可以帮忙找到我想要的东西吗?

1 个答案:

答案 0 :(得分:1)

我可以告诉工厂SpringFactoriesLoader的{​​{1}}机制仅由PropertySourceLoader使用,PropertySourcesLoader仅用于加载应用程序属性。这些是application.propertiesapplication.ymlapplication.yaml。因此,对于您的示例,只需将文件application.properties添加到类路径中,您就会得到您期望的异常。 我不知道的是为什么其他属性源导入机制(如使用注释@PropertySource)不会通过PropertySourcesLoader来利用工厂加载器和覆盖机制。