私はSpringBootにEnvironmentPostProcessorを作成して、データベースからプロパティを取得し、PropertySourceとしてSpringのEnvironment
に接続しました。 EnvironmentPostProcessor実行でエラーをログに記録する方法
この
は私が持っているコードです:@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Map<String, Object> propertySource = new HashMap<>();
// LOG SOMETHING HERE *******************
logger.error("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
String[] activeProfiles = environment.getActiveProfiles();
String[] defaultProfiles = environment.getDefaultProfiles();
// Do not pull db configuration when 'default' profile (used by Jenkins only) is run
if (activeProfiles.length == 0 && defaultProfiles[0] == "default") {
return;
}
// Load properties for Config schema
String dataSourceUrl = environment.getProperty("service.datasource.url");
String username = environment.getProperty("service.datasource.username");
String password = environment.getProperty("service.datasource.password");
String driver = environment.getProperty("service.datasource.driverClassName");
try {
// Build manually datasource to Config
DataSource ds = DataSourceBuilder
.create()
.username(username)
.password(password)
.url(dataSourceUrl)
.driverClassName(driver)
.build();
// Fetch all properties
PreparedStatement preparedStatement = ds.getConnection().prepareStatement("SELECT name, value FROM propertyConfig WHERE service = ?");
preparedStatement.setString(1, APP_NAME);
ResultSet rs = preparedStatement.executeQuery();
// Populate all properties into the property source
while (rs.next()) {
String propName = rs.getString("name");
propertySource.put(propName, rs.getString("value"));
}
// Create a custom property source with the highest precedence and add it to Spring Environment
environment.getPropertySources().addFirst(new MapPropertySource(PROPERTY_SOURCE_NAME, propertySource));
} catch (Exception e) {
throw new Exception("Error fetching properties from ServiceConfig");
}
}
そして、これはmain/META-INF/spring-factories
ファイルが作成されなければならなかったです:コードはうまく機能
# Environment Post Processor
org.springframework.boot.env.EnvironmentPostProcessor=com.blabla.config.ReadDbPropertiesPostProcessor
、それは私が必要なものをDBから取得します。しかし、私はこれについての情報を記録したいと思います。何か問題が発生した場合、例えばdbがダウンしている場合、エラーをログに記録してアプリを起動するのを止めたいのです。私のアプリは、コンソールではなくロガーを使用するように設定されています。
例外をスローしてエラーを記録しようとしましたが、何かを印刷してもログは決してこの情報を記録しません。
この初期段階でロガーを使用するにはどうすればよいですか?とにかくこれを行うことは可能ですか? EnvironmentPostProcessorを間違って使用していますか?
回答ありがとうございます。非常に有益です...今すぐテストしてみましょう。何かを明確にしたいのですが、どのようにApplicationEventを結び付けますか?これらのイベントを購読/登録する場所はありますか?これはspringbootによって自動的に検出されますか? –
'ApplicationListener'を実装し、あなたのクラスに' @ Component'を付けると、springはそれを自動的に 'ApplicationEvent'に登録します。 –
最後の質問は、私のコードを参照してください...それはキャッチブロックがあり、実行時例外をスローします。例外がスローされた場合、ログは設定されません。このケースをどのように扱うか知っていますか? –