propertysource leer example application spring spring-boot spring-annotations

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 o basePackages (o su value 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