2015-02-20 10 views
5

Ich verwende Spring Boot-Anwendung. In einigen @Component Klasse @Value Felder sind geladen, stattdessen auf anderen Klassen sind sie immer null.

Scheint, dass @Value (s) geladen werden, nachdem meine @Bean/@Component erstellt wurden.

Ich muss einige Werte aus einer Eigenschaftendatei in meinem @Bean laden.

Haben Sie Vorschläge?

+0

Sind die "anderen Klassen" als Frühlingsbohnen registriert? Was ist der Unterschied zwischen denen, die die Werte erhalten und denen, die nicht? –

+0

Sicher, sie sind oder Bean oder Komponente – drenda

+0

Suchen Sie nach den Werten im Konstruktor? –

Antwort

0

Haben Sie versucht:

@Component 
@PropertySource("file:/your/file/path") 
public class MyBean { 

    private @Value("${property}") String property; 
    ... 
} 
+0

Verwenden von @PropertySource ("classpath: application.properties") Ich habe während des Startvorgangs eine Ausnahme: Keine berechtigte Bean vom Typ [org.springframework.core.io.Resource] für Abhängigkeit gefunden: erwartet mindestens 1 Bean, die als Autowire gilt Kandidat für diese Abhängigkeit. Abhängigkeitsanmerkungen: {@ javax.inject.Inject()}. Danke – drenda

+0

Haben Sie die Klasse mit '@ Component' kommentiert? –

+0

Ja. @Evgeni hat das Problem zentriert. Ich kann das Wertfeld innerhalb des Konstruktors nicht wie bisher verwenden. – drenda

15

Die Eigenschaften (und alle die Bohne Abhängigkeiten) injiziert werden, nachdem die Bohne (die Ausführung des Konstrukteurs) aufgebaut ist.

Sie können die Konstruktorinjektion verwenden, wenn Sie sie dort benötigen.

@Component 
public class SomeBean { 
    private String prop; 
    @Autowired 
    public SomeBean(@Value("${some.prop}") String prop) { 
     this.prop = prop; 
     //use it here 
    } 
} 

Eine weitere Option ist die Konstruktor Logik in der Methode mit @PostConstruct kommentierte bewegen sie ausgeführt werden, nachdem die Bohne erstellt und alle seine Abhängigkeiten und Eigenschaftswerte aufgelöst werden.

+0

Und wer wird diesen Konstruktor nennen? Ich versuche es, aber dieser 'benutzerdefinierte' Konstruktor wird nicht aufgerufen. – drenda

+0

Sie haben wahrscheinlich auch den Standard und den benutzerdefinierten Konstruktor. Entfernen Sie den ohne Parameter. –

+0

Ich kann nicht, weil ich eine Ausnahme habe, die den Standardkonstruktor entfernt: Kein Standardkonstruktor gefunden; Verschachtelte Ausnahme ist java.lang.NoSuchMethodException: it.modem.ModemManager. () – drenda

-1

Ein anderer möglicher Grund ist, dass die @Value-Zeilen unter den Zeilen liegen, die diese Eigenschaften/Werte benötigen.

Ich verbrachte viel Zeit damit, dieses Problem zu beheben, und fand heraus, dass die Reihenfolge der Zeilen von Bedeutung ist!

Verwandte Themen