Ich habe eine SpringBoot App, die mit integriertem Tomcat ausgeführt wird. Dieser Listener ist dafür zuständig, die Anwendungseigenschaften aus einer MySQL-Datenbank zu laden und in die Umgebung einzufügen. Es sieht wie folgt aus:Spring Boot Embedded Tomcat lädt externe Eigenschaftendatei nicht in ApplicationListener
@Component
public class DbMigrationAndPropertyLoaderApplicationListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent>, Ordered {
private static final Logger LOGGER = LoggerFactory.getLogger(DbMigrationAndPropertyLoaderApplicationListener.class);
private static final String PROPERTY_SOURCE_NAME = "applicationProperties";
private final int order = Ordered.HIGHEST_PRECEDENCE + 4;
private final PropertySourceProcessor propertySourceProcessor = new PropertySourceProcessor();
@Override
public int getOrder() {
return this.order;
}
@Override
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
Properties databaseProperties;
try {
databaseProperties = PropertiesLoaderUtils.loadAllProperties("application-datasource.properties");
} catch (IOException e) {
throw new RuntimeException("Unable to load properties from application-datasource.properties. Please ensure that this file is on your classpath", e);
}
ConfigurableEnvironment environment = event.getEnvironment();
Map<String, Object> propertySource = new HashMap<>();
try {
DataSource ds = DataSourceBuilder
.create()
.username(databaseProperties.getProperty("flyway.user"))
.password(EncryptionUtil.decrypt(databaseProperties.getProperty("flyway.password")))
.url(databaseProperties.getProperty("spring.datasource.url"))
.driverClassName(databaseProperties.getProperty("spring.datasource.driver-class-name"))
.build();
LOGGER.debug("Running Flyway Migrations");
//Run Flyway migrations. If this is the first time, it will create and populate the APPLICATION_PROPERTY table.
Flyway flyway = new Flyway();
flyway.setDataSource(ds);
flyway.migrate();
LOGGER.debug("Initializing properties from APPLICATION_PROPERTY table");
//Fetch all properties
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = ds.getConnection();
preparedStatement = connection.prepareStatement("SELECT prop_key, prop_value FROM APPLICATION_PROPERTY");
resultSet = preparedStatement.executeQuery();
//Populate all properties into the property source
while (resultSet.next()) {
String propName = resultSet.getString("prop_key");
propertySource.put(propName, propertySourceProcessor.decrypt(resultSet.getString("prop_value")));
}
//Create a custom property source with the highest precedence and add it to the Environment
environment.getPropertySources().addFirst(new MapPropertySource(PROPERTY_SOURCE_NAME, propertySource));
ich so um die Anwendung aufzurufen:
public static void main(String[] args) {
ApplicationContext ctx = new SpringApplicationBuilder(PortalApplication.class)
.listeners(new DbMigrationAndPropertyLoaderApplicationListener())
.build(args)
.run();
Was ich versuche zu tun, um die application-datasource.properties Datei auszulagern, damit es auf meine verschiedenen residieren kann App-Server (Dev, QA, Prod etc.). Ich bin jedoch nicht in der Lage, den Zuhörer dazu zu bringen, diese Eigenschaftendatei zu finden, und ich bin nicht sicher, warum. Ich versuchte, die RUN_ARGS Eigenschaft in der deployment.conf Datei zu so etwas wie
RUN_ARGS Einstellung = - spring.config.location =/path/to/application-datasource.properties
Ich habe auch versucht, das Hinzufügen Verzeichnis mit der Eigenschaftendatei zum Klassenpfad. Nichts, was ich tue, scheint zu funktionieren, aber ich bin mir sicher, ich mache hier nur etwas Dummes. Beachten Sie, dass ich beim Laden der Datei keine Ausnahme erhalte, die resultierenden Eigenschaften sind einfach leer.
Nun, das Problem ist, ich habe, dass meine Anwendung Hörer ausführt, bevor Bohnen oder vor dem autowiring abgeschlossen erstellt wurden, so Die Anwendungseigenschaften wurden noch nicht geladen. Daher versuche ich, die Eigenschaftendatei manuell aus dem Klassenpfad zu laden und dann die Eigenschaften zu verwenden, um eine Datenquelle zu initialisieren und den Rest meiner Eigenschaften abzurufen und in die Umgebung zu übertragen, damit sie bei der App-Initialisierung verfügbar sind. – cloudwalker
ok ich habe deinen Punkt und ich glaube, es gibt ein Problem mit bereitgestellten Pfad. –
ok ich habe Ihren Punkt und ich glaube, es gibt ein Problem mit bereitgestellten Pfad, zum Beispiel bieten Sie Pfad wie '/path/to/application-datasource.properties', aber Frühjahr nicht unter Unterverzeichnissen des Klassenpfads 'src/main/Ressourcen/'standardmäßig. Ich werde meine Antwort entsprechend aktualisieren. –