2017-02-20 28 views
1

Я не могу прочитать свойство из файла свойств через Spring Boot. У меня есть служба REST, которая работает через браузер и Postman и возвращает мне действительный ответ 200 с данными.Невозможно прочитать значение из файла свойств в Spring Boot с помощью аннотации @Value

Однако я не могу прочитать свойство через этот клиент Spring Boot, используя аннотацию @Value и получая следующее исключение.

Исключение:

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

является 'HelloWorldClient' весной фасолью? – Andrew

+0

Класс не аннотируется ничем, поэтому я полагаю, что это не так. – user2325154

+0

Ваш основной класс должен быть аннотирован с помощью @SpringBootApplication –

ответ

4

В коде есть несколько проблем.

  1. Из образцов, которые вы отправили, кажется, что Весна даже не началась. Основной класс должен использовать контекст в вашем основном методе.

    @SpringBootApplication 
    public class HelloWorldApp { 
    
        public static void main(String[] args) { 
          SpringApplication.run(HelloWorldApp.class, args); 
        } 
    
    } 
    
  2. Невозможно ввести значение в статическое поле. Вы должны начать с изменения его в обычное поле класса.

  3. Класс должен управляться пружинным контейнером, чтобы обеспечить доступность значений. Если вы используете сканирование компонентов по умолчанию, вы можете просто аннотировать вновь созданный клиентский класс с помощью аннотации @Component.

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

    Если вы не хотите, чтобы аннотировать класс, который вы можете создать компонент в одном из ваших классов конфигурации или основного класса Spring загрузки.

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

    Однако, если вы являетесь владельцем класса, то первый вариант является предпочтительным. Независимо от того, какой путь вы выбираете, цель состоит в том, чтобы контекст Spring знал о существовании класса, поэтому процесс инъекции может произойти.

+1

Я также добавил, что приложение весны необходимо запустить в основном классе. –

 Смежные вопросы

  • Нет связанных вопросов^_^