2014-09-10 11 views
47

Ho un'app di Spring Boot molto semplice che sto cercando di lavorare con alcune configurazioni esterne. Ho provato a seguire le informazioni sullo spring boot documentation ma sto colpendo un blocco stradale.Valore Boot application.properties non popoloso

Quando eseguo l'app sotto la configurazione esterna nel file application.properties non viene inserito nella variabile all'interno del bean. Sono sicuro che sto facendo qualcosa di stupido, grazie per qualsiasi suggerimento.

MyBean.java (in/src/main/java/foo/bar /)

package foo.bar; 

import org.springframework.beans.factory.annotation.Value; 
import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.boot.context.properties.EnableConfigurationProperties; 
import org.springframework.stereotype.Component; 

@Component 
public class MyBean { 

    @Value("${some.prop}") 
    private String prop; 

    public MyBean() { 
     System.out.println("================== " + prop + "================== "); 
    } 
} 

Application.java (in/src/main/java/foo /)

package foo; 

import foo.bar.MyBean; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.boot.SpringApplication; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class Application { 

    @Autowired 
    private MyBean myBean; 

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

application.properties (che si trova in/principali risorse/src//)

some.prop=aabbcc 

uscita Log quando si esegue l'applicazione Primavera Boot:

grb-macbook-pro:properties-test-app grahamrb$ java -jar ./build/libs/properties-test-app-0.1.0.jar 

    . ____   _   __ _ _ 
/\\/___'_ __ _ _(_)_ __ __ _ \ \ \ \ 
(()\___ | '_ | '_| | '_ \/ _` | \ \ \ \ 
\\/ ___)| |_)| | | | | || (_| | )))) 
    ' |____| .__|_| |_|_| |_\__, |//// 
=========|_|==============|___/=/_/_/_/ 
:: Spring Boot ::  (v1.1.5.RELEASE) 

2014-09-10 21:28:42.149 INFO 16554 --- [   main] foo.Application       : Starting Application on grb-macbook-pro.local with PID 16554 (/Users/grahamrb/Dropbox/dev-projects/spring-apps/properties-test-app/build/libs/properties-test-app-0.1.0.jar started by grahamrb in /Users/grahamrb/Dropbox/dev-projects/spring-apps/properties-test-app) 
2014-09-10 21:28:42.196 INFO 16554 --- [   main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot[email protected]67e38ec8: startup date [Wed Sep 10 21:28:42 EST 2014]; root of context hierarchy 
2014-09-10 21:28:42.828 INFO 16554 --- [   main] o.s.b.f.s.DefaultListableBeanFactory  : Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]] 
2014-09-10 21:28:43.592 INFO 16554 --- [   main] .t.TomcatEmbeddedServletContainerFactory : Server initialized with port: 8080 
2014-09-10 21:28:43.784 INFO 16554 --- [   main] o.apache.catalina.core.StandardService : Starting service Tomcat 
2014-09-10 21:28:43.785 INFO 16554 --- [   main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.54 
2014-09-10 21:28:43.889 INFO 16554 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]  : Initializing Spring embedded WebApplicationContext 
2014-09-10 21:28:43.889 INFO 16554 --- [ost-startStop-1] o.s.web.context.ContextLoader   : Root WebApplicationContext: initialization completed in 1695 ms 
2014-09-10 21:28:44.391 INFO 16554 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/] 
2014-09-10 21:28:44.393 INFO 16554 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 
================== null================== 
2014-09-10 21:28:44.606 INFO 16554 --- [   main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 
2014-09-10 21:28:44.679 INFO 16554 --- [   main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 
2014-09-10 21:28:44.679 INFO 16554 --- [   main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[text/html],custom=[]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest) 
2014-09-10 21:28:44.716 INFO 16554 --- [   main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 
2014-09-10 21:28:44.716 INFO 16554 --- [   main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 
2014-09-10 21:28:44.902 INFO 16554 --- [   main] o.s.j.e.a.AnnotationMBeanExporter  : Registering beans for JMX exposure on startup 
2014-09-10 21:28:44.963 INFO 16554 --- [   main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080/http 
2014-09-10 21:28:44.965 INFO 16554 --- [   main] foo.Application       : Started Application in 3.316 seconds (JVM running for 3.822) 
^C2014-09-10 21:28:54.223 INFO 16554 --- [  Thread-2] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot[email protected]67e38ec8: startup date [Wed Sep 10 21:28:42 EST 2014]; root of context hierarchy 
2014-09-10 21:28:54.225 INFO 16554 --- [  Thread-2] o.s.j.e.a.AnnotationMBeanExporter  : Unregistering JMX-exposed beans on shutdown 
+2

E come deve essere sostituito il valore "@" prima della costruzione di un bean? Il tuo modo di "rilevare" se il valore è impostato è sbagliato. In quel momento sarà sempre nullo poiché "@ Value" sarà elaborato DOPO la costruzione dell'oggetto. –

risposta

94

Il modo in cui si sta eseguendo l'iniezione della proprietà non funzionerà, perché l'iniezione viene eseguita dopo che il costruttore viene chiamato.

Hai bisogno di fare una delle seguenti:

migliore soluzione

@Component 
public class MyBean { 

    private final String prop; 

    @Autowired 
    public MyBean(@Value("${some.prop}") String prop) { 
     this.prop = prop; 
     System.out.println("================== " + prop + "================== "); 
    } 
} 

soluzione che funziona, ma è meno controllabile e un po 'meno leggibile

@Component 
public class MyBean { 

    @Value("${some.prop}") 
    private String prop; 

    public MyBean() { 

    } 

    @PostConstruct 
    public void init() { 
     System.out.println("================== " + prop + "================== "); 
    } 
} 

anche si noti che non è specifico di Spring Boot ma si applica a qualsiasi applicazione Spring

+1

Grazie geoand, entrambi hanno funzionato! – grahamrb

+0

@grahamrb Felice di sentirlo! – geoand

+0

Ho dovuto aggiungere un'annotazione @Autowired al costruttore per farlo funzionare –

2

L'utente "geoand" ha ragione nel precisare i motivi e dare una soluzione. Ma un approccio migliore è quello di incapsulare la tua configurazione in una classe separata, ad esempio la classe java di SystemContiguration e quindi iniettare questa classe in tutti i servizi che desideri utilizzare.

Il modo corrente (@grahamrb) di leggere i valori di configurazione direttamente nei servizi è soggetto ad errori e causerebbe il refactoring del mal di testa se viene modificato il nome dell'impostazione di configurazione.

0

In realtà, per me qui di seguito funziona bene.

@Component 
public class MyBean { 

    public static String prop; 

    @Value("${some.prop}") 
    public void setProp(String prop) { 
     this.prop= prop; 
    } 

    public MyBean() { 

    } 

    @PostConstruct 
    public void init() { 
     System.out.println("================== " + prop + "================== "); 
    } 

}

Ora dovunque voglio, basta invocare

MyBean.prop

sarà valore di ritorno.

Problemi correlati