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:
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
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();
}