java spring spring-boot properties-file

java - Archivo de propiedades de carga de proyectos de módulos múltiples Spring-Boot



properties-file (5)

Aquí hay un ejemplo de varios módulos de Spring Boot en el que puede obtener propiedades en diferentes módulos. Digamos que tengo el módulo de aplicación principal , el módulo dataparse, el módulo datasave.

StartApp.java en el módulo de aplicación :

@SpringBootApplication public class StartApp { public static void main(String[] args) { SpringApplication.run(StartApp.class, args); } }

Configuración en el módulo dataparse . ParseConfig.java :

@Configuration public class ParseConfig { @Bean public XmlParseService xmlParseService() { return new XmlParseService(); } }

XmlParseService.java:

@Service public class XmlParseService {...}

Configuración en módulo datasave . SaveConfig.java:

@Configuration @EnableConfigurationProperties(ServiceProperties.class) @Import(ParseConfig.class)//get beans from dataparse-module - in this case XmlParseService public class SaveConfig { @Bean public SaveXmlService saveXmlService() { return new SaveXmlService(); } }

ServiceProperties.java:

@ConfigurationProperties("datasave") public class ServiceProperties { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }

application.properties en datasave-module en la carpeta resource / config :

datasave.message = ¡Proyecto Maven multi-módulo!

threads.xml.number = 5

file.location.on.disk = D: / temp / registry

Luego, en el módulo datasave, puede usar todas sus propiedades a través de @Value.

SaveXmlService.java:

@Service public class SaveXmlService { @Autowired XmlParseService xmlParseService; @Value("${file.location.on.disk: none}") private String fileLocation; @Value("${threads.xml.number: 3}") private int numberOfXmlThreads; ... }

O a través de ServiceProperties:

Service.java:

@Component public class Service { @Autowired ServiceProperties serviceProperties; public String message() { return serviceProperties.getMessage(); } }

Tengo un Spring-Boot-Application como un proyecto multimodular en maven. La estructura es la siguiente:

Parent-Project |--MainApplication |--Module1 |--ModuleN

En el proyecto MainApplication hay la clase de método main() anotada con @SpringBootApplication y así sucesivamente. Este proyecto tiene, como siempre, un archivo application.properties que se carga automáticamente. Así que puedo acceder a los valores con la anotación @Value

@Value("${myapp.api-key}") private String apiKey;

Dentro de mi Module1 también quiero usar un archivo de propiedades (llamado module1.properties), donde se almacena la configuración de los módulos. Solo se podrá acceder y utilizar este archivo en el módulo. Pero no puedo cargarlo. Lo intenté con @Configuration y @PropertySource pero no @PropertySource suerte.

@Configuration @PropertySource(value = "classpath:module1.properties") public class ConfigClass {

¿Cómo puedo cargar un archivo de propiedades con Spring-Boot y acceder a los valores fácilmente? No se pudo encontrar una solución válida.

Mi configuracion

@Configuration @PropertySource(value = "classpath:tmdb.properties") public class TMDbConfig { @Value("${moviedb.tmdb.api-key}") private String apiKey; public String getApiKey() { return apiKey; } @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } }

Llamando a la configuración

@Component public class TMDbWarper { @Autowired private TMDbConfig tmdbConfig; private TmdbApi tmdbApi; public TMDbWarper(){ tmdbApi = new TmdbApi(tmdbConfig.getApiKey()); }

Obtengo una NullPointerException en el constructor cuando autowire el warper.


El cableado automático se realiza justo después de la creación del objeto (después de llamar al constructor a través de la reflexión). Por lo tanto, se espera la tmdbConfig NullPointerException en su constructor, ya que el campo tmdbConfig sería nulo durante la invocación del constructor

Puede solucionar este problema utilizando el método de devolución de llamada @PostConstruct como se muestra a continuación:

@Component public class TMDbWarper { @Autowired private TMDbConfig tmdbConfig; private TmdbApi tmdbApi; public TMDbWarper() { } @PostConstruct public void init() { tmdbApi = new TmdbApi(tmdbConfig.getApiKey()); } public TmdbApi getTmdbApi() { return this.tmdbApi; } }

El resto de su configuración me parece correcta.

Espero que esto ayude.


Podrías autorizar y usar el bean Enviornment para leer la propiedad

@Configuration @PropertySource(value = "classpath:tmdb.properties") public class TMDbConfig { @Autowired private Environment env; public String getApiKey() { return env.getRequiredProperty("moviedb.tmdb.api-key"); } }

Esto debería garantizar que la propiedad se lea del contexto cuando invoque el método getApiKey() independientemente de cuándo @Value expresión @Value con PropertySourcesPlaceholderConfigurer .


Tuve esta situación antes, noté que el archivo de propiedades no se había copiado al archivo jar.

Hice lo siguiente para que funcione:

  1. En la carpeta de recursos, he creado un paquete único y luego almacené mi archivo application.properties dentro de él. por ejemplo: com / empresa / proyecto

  2. En el archivo de configuración, por ejemplo: TMDBConfig.java, he hecho referencia a la ruta completa de mi archivo .properties:

    @Configuration @PropertySource("classpath:/com/company/project/application.properties") public class AwsConfig

Construye y corre, funcionará como magia.


Para inyección de campo:

Los campos se inyectan justo después de la construcción de un bean, antes de invocar cualquier método de configuración. Tal campo de configuración no tiene que ser público. Consulte la anotación Autowired para uso completo. Utilice inyección de constructor en este caso como a continuación:

@Component public class TMDbWarper { private TMDbConfig tmdbConfig; private TmdbApi tmdbApi; @Autowired public TMDbWarper(final TMDbConfig tmdbConfig){ this.tmdbConfig = tmdbConfig; tmdbApi = new TmdbApi(tmdbConfig.getApiKey()); }

(o)

Use @PostConstruct para iniciar como se muestra a continuación:

@Component public class TMDbWarper { @Autowired private TMDbConfig tmdbConfig; private TmdbApi tmdbApi; @PostConstruct public void init() { // any initialisation method tmdbConfig.getConfig(); }