2017-07-04 6 views
0

Ich benutze Spring Boot 1.5.3 und versuche, die Eigenschaften aus einer Datei application-dev.properties in eine Service-Bean zu injizieren, aber der Wert kommt immer als Null. Der Wert wird jedoch in meine DevConfiguration-Klasse geladen.Spring Boot @Value immer Null

Ich habe eine Anwendungsklasse, wie unten in meinem Basispaket

package com.me; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; 

@SpringBootApplication 
public class Application { 

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

} 

ich eine Konfigurationsklasse haben wie in

package com.me.print.config; 

import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Profile; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.context.annotation.PropertySources; 
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; 

@Configuration 
@Profile("dev") 
@PropertySources({ 
    @PropertySource("classpath:application.properties"), 
    @PropertySource("classpath:application-dev.properties") 
}) 
@ComponentScan(value = {"com.me.print.client"}) 
public class DevConfiguration { 

    @Value("${app.service.url}") 
    private String rootUri; 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

} 

Mein Service Bohne folgt, die ich versuche, den Wert zu laden in ist unter

package com.me.print.client; 

import org.springframework.beans.factory.annotation.Value; 
import org.springframework.boot.web.client.RestTemplateBuilder; 
import org.springframework.stereotype.Service; 
import org.springframework.web.client.RestTemplate; 

import com.me.print.model.zitResponse; 

@Service 
public class zitPrintClient { 

    private final RestTemplate restTemplate; 

    @Value("${app.service.url}") 
    private String rootUri; 

    public zitPrintClient(RestTemplateBuilder restTemplateBuilder) { 
     restTemplate = restTemplateBuilder 
       //.rootUri(rootUri) 
       .build(); 
    } 

    public zitResponse getpooltatus(String poolId) { 
     return restTemplate.getForObject("/pool/{poolId}/@status", 
        zitResponse.class, poolId); 
    } 

} 

In der obigen Klasse ist der rootURI immer Null. Hat jemand irgendwelche Vorschläge, was ich vermisst

in meiner application-dev.properties Datei habe ich die folgende

app.service.url=http://localhost:8080/zitprint/v1 

Dank

UPDATE:

hat jemand irgendwelche Vorschläge hier, als ich versuchte, Eigenschaften in meinen Controller wie folgt zu injizieren:

@Value("${allowedVendors}") String allowedVendors 

und wenn ich die oben in einen Konstruktor setzen findet sie den Wert aber ist es nicht anders finden:

public PController(@Value("${allowedVendors}") String allowedVendors) { 

} 

Ich kann nicht die Eigenschaft weiter im Code als mit dem Konstruktor verwende ich zwei Instanzen der Bean erstellt haben 1 über den Konstruktor und der andere von Feder DI erstellt. Irgendwelche Ideen, warum der Wert ohne den Konstruktor injizieren tut

Dank

+0

, die wie seltsames Verhalten mir scheint. Wenn ich Probleme mit der Abholung von Eigenschaften habe, würde der Wert von rootUri normalerweise nur das String-Literal "$ {app.service.url}" annehmen. – Plog

+0

Bist du sicher, dass deine App mit dem Dev-Profil gestartet wurde? – Leffchik

+0

Ja dev-Profil ist aktiv. – user1107753

Antwort

0

Sie müssen es als Parameter im Konstruktor setzen:

public zitPrintClient(RestTemplateBuilder restTemplateBuilder, 
    @Value("${app.service.url}") rootUri) { 
     this.rootUri = rootUri; // if you are only using this once, 
           // no need to keep this member variable around 
     restTemplate = restTemplateBuilder 
       .rootUri(rootUri) 
       .build(); 
    } 

Der Konstruktor zuerst aufgerufen wird, wenn Sie das Objekt erstellen. Für die Elementvariable rootUri wird der Wert injiziert, nachdem das Objekt erstellt wurde. Die Membervariable rootUri wäre also zum Zeitpunkt des Aufrufs des Konstruktors null.

(Und imho, zur besseren Lesbarkeit, Ihre Klasse sollte mit einem Großbuchstaben beginnen, das heißt ZitPrintClient, aber es ist der Code ...)

Verwandte Themen