2017-02-20 3 views
1

Ich kann keine Eigenschaft aus der Eigenschaftendatei über Spring Boot lesen. Ich habe einen REST-Dienst, der sowohl über den Browser als auch über Postman funktioniert und mir eine gültige 200-Antwort mit Daten zurückgibt.Nicht in der Lage, den Wert aus der Eigenschaftendatei im Spring Boot mit der @Value Annotation zu lesen

Allerdings kann ich keine Eigenschaft über diesen Spring Boot-Client mit @Value-Annotation lesen und die folgende Ausnahme erhalten.

Ausnahme:

helloWorldUrl = null 
Exception in thread "main" java.lang.IllegalArgumentException: URI must not be null 
    at org.springframework.util.Assert.notNull(Assert.java:115) 
    at org.springframework.web.util.UriComponentsBuilder.fromUriString(UriComponentsBuilder.java:189) 
    at org.springframework.web.util.DefaultUriTemplateHandler.initUriComponentsBuilder(DefaultUriTemplateHandler.java:114) 
    at org.springframework.web.util.DefaultUriTemplateHandler.expandInternal(DefaultUriTemplateHandler.java:103) 
    at org.springframework.web.util.AbstractUriTemplateHandler.expand(AbstractUriTemplateHandler.java:106) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:612) 
    at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:287) 
    at com.example.HelloWorldClient.main(HelloWorldClient.java:19) 

HelloWorldClient.java

public class HelloWorldClient { 

    @Value("${rest.uri}") 
    private static String helloWorldUrl; 

    public static void main(String[] args) { 
     System.out.println("helloWorldUrl = " + helloWorldUrl); 
     String message = new RestTemplate().getForObject(helloWorldUrl, String.class); 
     System.out.println("message = " + message); 
    } 

} 

application.properties

rest.uri=http://localhost:8080/hello 
+2

ist 'HelloWorldClient' eine Frühlingsbohne? – Andrew

+0

Die Klasse ist nicht mit etwas annotiert, daher nehme ich an, dass es nicht ist. – user2325154

+0

Ihre Hauptklasse sollte mit @SpringBootApplication versehen sein. –

Antwort

4

In Ihrem Code gibt es mehrere Probleme.

  1. Aus den Samples, die Sie gepostet haben, scheint es, dass Spring nicht einmal gestartet wurde. Die Hauptklasse sollte den Kontext in Ihrer Hauptmethode ausführen.

    @SpringBootApplication 
    public class HelloWorldApp { 
    
        public static void main(String[] args) { 
          SpringApplication.run(HelloWorldApp.class, args); 
        } 
    
    } 
    
  2. Es ist nicht möglich, einen Wert in ein statisches Feld zu injizieren. Sie sollten damit beginnen, es in ein reguläres Klassenfeld zu ändern.

  3. Die Klasse muss vom Spring-Container verwaltet werden, damit die Value Injection verfügbar ist. Wenn Sie den Standardkomponenten-Scan verwenden, können Sie die neu erstellte Client-Klasse einfach mit der Annotation @Component annotieren.

    @Component 
    public class HelloWorldClient { 
        // ... 
    } 
    

    Wenn Sie nicht wollen, um die Klasse zu annotieren Sie in einem Ihrer Konfigurationsklassen oder Ihre Haupt Frühlings-Boot-Klasse eine Bohne erstellen können.

    @SpringBootApplication 
    public class HelloWorldApp { 
    
        // ...  
    
        @Bean 
        public HelloWorldClient helloWorldClient() { 
        return new HelloWorldClient(); 
        } 
    
    } 
    

    Wenn Sie jedoch der Besitzer der Klasse sind, ist die erste Option vorzuziehen. Ganz gleich, auf welche Weise Sie sich entscheiden, das Ziel besteht darin, den Spring-Kontext auf die Klassenexistenz aufmerksam zu machen, damit der Injektionsprozess stattfinden kann.

+1

Ich würde auch hinzufügen, dass die Feder-Anwendung in der Hauptklasse gestartet werden muss. –

Verwandte Themen