leer - Spring Boot @Value Properties
spring inject properties (8)
Tengo una aplicación Spring Boot y en una de las clases, trato de hacer referencia a una propiedad del archivo application.properties usando @Value
. Pero, la propiedad no se resuelve. He mirado publicaciones similares y he intentado seguir las sugerencias, pero eso no ayudó. La clase es:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class PrintProperty {
@Value("${file.directory}")
private String fileDirectory;
public void print() {
System.out.println(fileDirectory);
}
}
Tengo la propiedad file.directory en application.properties
. Tengo otros campos también.
Asegúrese de que su archivo application.properties esté en src / main / resources / application.properties. Es una manera de ir. Luego agregue @PostConstruct como sigue
Ejemplo de aplicaciones.propiedades
file.directory = somePlaceOverHere
Ejemplo de clase Java
@ComponentScan
public class PrintProperty {
@Value("${file.directory}")
private String fileDirectory;
@PostConstruct
public void print() {
System.out.println(fileDirectory);
}
}
El código de arriba imprimirá "somePlaceOverhere"
Como está utilizando Spring Boot, la única forma en que creo que actualmente no funciona es porque no ha agregado la anotación @PropertySource
.
Por favor inténtalo y déjame saber tus comentarios. ¡Gracias!
@Configuration
@ComponentScan
@PropertySource("classpath:/application.properties")
@EnableAutoConfiguration
public class PrintProperty {
@Value("${file.directory}")
private String fileDirectory;
public void print() {
System.out.println(fileDirectory);
}
}
Me gustaría mencionar que usé la versión 1.4.0 de spring boot y desde esta versión solo puedes escribir:
@Component
public class MongoConnection {
@Value("${spring.data.mongodb.host}")
private String mongoHost;
@Value("${spring.data.mongodb.port}")
private int mongoPort;
@Value("${spring.data.mongodb.database}")
private String mongoDB;
}
Luego inyecta clase cuando quieras.
No ha incluido declaraciones de paquetes en el OP pero es posible que ni @SpringBootApplication
ni @ComponentScan
estén @Component
su @Component
.
El @ComponentScan
Javadoc declara:
Se pueden especificar
basePackageClasses
basePackages
basePackageClasses
obasePackages
(o suvalue
alias) para definir paquetes específicos para analizar. Si no se definen paquetes específicos, la exploración se realizará desde el paquete de la clase que declara esta anotación.
ISTR perdió mucho tiempo en esto antes y me resultó más fácil simplemente mover mi clase de aplicación al paquete más alto en el árbol de paquetes de mi aplicación.
Más recientemente, encontré un gotcha en el que se estaba leyendo la propiedad antes de que se hubiera realizado la inserción de valor. La respuesta de Jesse fue de ayuda, ya que @PostConstruct
parece ser la primera vez que puede leer los valores insertados, y por supuesto debe dejar que Spring lo llame.
Para leer los valores de application.properties necesitamos simplemente anotar nuestra clase principal con @SpringBootApplication
y la clase en la que está leyendo con @Component o una variedad de ellos. A continuación se muestra el ejemplo donde he leído los valores de application.properties
y está funcionando bien cuando se invoca el servicio web. Si implementa el mismo código y trata de acceder desde http://localhost:8080/hello , obtendrá el valor que ha almacenado en application.properties para el mensaje clave.
package com.example;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication {
@Value("${message}")
private String message;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RequestMapping("/hello")
String home() {
return message;
}
}
Prueba y me avisas
Su problema es que necesita una definición static
PropertySourcesPlaceholderConfigurer
Bean en su configuración. Digo estática con énfasis, porque tenía una no estática y no funcionó.
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
Tuve el mismo problema que tú. Aquí está mi código de error.
@Component
public class GetExprsAndEnvId {
@Value("hello")
private String Mysecret;
public GetExprsAndEnvId() {
System.out.println("construct");
}
public void print(){
System.out.println(this.Mysecret);
}
public String getMysecret() {
return Mysecret;
}
public void setMysecret(String mysecret) {
Mysecret = mysecret;
}
}
Este no es un problema como este, pero necesitamos usarlo así:
@Autowired
private GetExprsAndEnvId getExprsAndEnvId;
así no:
getExprsAndEnvId = new GetExprsAndEnvId();
Tuve un problema similar y los ejemplos anteriores no me ayudan a leer las propiedades. He publicado la clase completa que le ayudará a leer los valores de propiedades del archivo application.properties en la aplicación SpringBoot en el siguiente enlace.
Spring Boot - Environment @Autowired lanza NullPointerException