From ab0e2ffa683396e9cee6fe329977684c20e53272 Mon Sep 17 00:00:00 2001 From: Pablo de la Torre Jamardo Date: Fri, 19 Sep 2025 17:20:02 +0200 Subject: [PATCH] refactor(bootstrap): replace PostConstruct validator with ApplicationContextInitializer --- .../EnvironmentValidatorInitializer.java | 29 ++++++++++ .../bootstrap/RestEmailBridgeApplication.java | 4 +- .../config/AppPropertiesValidator.java | 55 ------------------- 3 files changed, 32 insertions(+), 56 deletions(-) create mode 100644 bootstrap/src/main/java/com/pablotj/restemailbridge/bootstrap/EnvironmentValidatorInitializer.java delete mode 100644 infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/config/AppPropertiesValidator.java diff --git a/bootstrap/src/main/java/com/pablotj/restemailbridge/bootstrap/EnvironmentValidatorInitializer.java b/bootstrap/src/main/java/com/pablotj/restemailbridge/bootstrap/EnvironmentValidatorInitializer.java new file mode 100644 index 0000000..3610a8c --- /dev/null +++ b/bootstrap/src/main/java/com/pablotj/restemailbridge/bootstrap/EnvironmentValidatorInitializer.java @@ -0,0 +1,29 @@ +package com.pablotj.restemailbridge.bootstrap; + +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; + +public class EnvironmentValidatorInitializer implements ApplicationContextInitializer { + + @Override + public void initialize(ConfigurableApplicationContext ctx) { + String[] requiredProperties = { + "APP_ENCRYPTION_SECRET", + "APP_ALLOWED_ORIGINS", + "DB_NAME", + "DB_USER", + "DB_PASSWORD", + "DB_HOST", + "DB_PORT", + "GMAIL_OAUTH_CLIENT_ID", + "GMAIL_OAUTH_CLIENT_SECRET" + }; + + for (String prop : requiredProperties) { + String value = ctx.getEnvironment().getProperty(prop); + if (value == null || value.isEmpty()) { + throw new IllegalStateException("ERROR: Property '" + prop + "' is not defined or empty"); + } + } + } +} diff --git a/bootstrap/src/main/java/com/pablotj/restemailbridge/bootstrap/RestEmailBridgeApplication.java b/bootstrap/src/main/java/com/pablotj/restemailbridge/bootstrap/RestEmailBridgeApplication.java index e3953b8..ec54ade 100644 --- a/bootstrap/src/main/java/com/pablotj/restemailbridge/bootstrap/RestEmailBridgeApplication.java +++ b/bootstrap/src/main/java/com/pablotj/restemailbridge/bootstrap/RestEmailBridgeApplication.java @@ -11,6 +11,8 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories; public class RestEmailBridgeApplication { public static void main(String[] args) { - SpringApplication.run(RestEmailBridgeApplication.class, args); + SpringApplication app = new SpringApplication(RestEmailBridgeApplication.class); + app.addInitializers(new EnvironmentValidatorInitializer()); + app.run(args); } } diff --git a/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/config/AppPropertiesValidator.java b/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/config/AppPropertiesValidator.java deleted file mode 100644 index 0f23143..0000000 --- a/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/config/AppPropertiesValidator.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.pablotj.restemailbridge.infrastructure.config; - -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -@Component -public class AppPropertiesValidator { - - private static final Logger log = LoggerFactory.getLogger(AppPropertiesValidator.class); - - @Value("${app.encryption.secret:}") - private String encryptionSecret; - - @Value("${app.cors.allowed-origins:}") - private String allowedOrigins; - - @Value("${spring.datasource.url:}") - private String datasourceUrl; - - @Value("${spring.datasource.username:}") - private String datasourceUser; - - @Value("${spring.datasource.password:}") - private String datasourcePassword; - - @Value("${gmail.oauth2.clientId:}") - private String gmailClientId; - - @Value("${gmail.oauth2.clientSecret:}") - private String gmailClientSecret; - - @PostConstruct - public void validate() { - check("APP_ENCRYPTION_SECRET", encryptionSecret, false); - check("APP_ALLOWED_ORIGINS", allowedOrigins, true); - check("DB_URL", datasourceUrl, true); - check("DB_USER", datasourceUser, true); - check("DB_PASSWORD", datasourcePassword, false); - check("GMAIL_OAUTH_CLIENT_ID", gmailClientId, true); - check("GMAIL_OAUTH_CLIENT_SECRET", gmailClientSecret, false); - } - - private void check(String name, String value, boolean logValue) { - if (value == null || value.isEmpty()) { - throw new IllegalStateException("ERROR: Property '" + name + "' is not defined or empty"); - } else if (logValue) { - log.info("Property '{}' is defined with value: {}", name, value); - } else { - log.info("Property '{}' is defined", name); - } - } -} \ No newline at end of file