使用Spring引导版本1.2.3(也使用1.2.5进行测试),我跟随creating-a-custom-jasypt-propertysource-in-springboot和Spring 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
,但我的应用程序已成功启动。任何人都可以帮忙找到我想要的东西吗?
答案 0 :(得分:1)
我可以告诉工厂SpringFactoriesLoader
的{{1}}机制仅由PropertySourceLoader
使用,PropertySourcesLoader
仅用于加载应用程序属性。这些是application.properties
,application.yml
或application.yaml
。因此,对于您的示例,只需将文件application.properties
添加到类路径中,您就会得到您期望的异常。
我不知道的是为什么其他属性源导入机制(如使用注释@PropertySource)不会通过PropertySourcesLoader
来利用工厂加载器和覆盖机制。