Я хотел бы использовать значение из файла application.properties, чтобы передать его в метод в другом классе. Проблема в том, что значение всегда возвращает NULL. В чем может быть проблема? Заранее спасибо.

< Сильный > application.properties

filesystem.directory=temp

< Сильный > FileSystem.java

@Value("${filesystem.directory}")
private static String directory;
14
Jonathan Williams 4 Сен 2017 в 11:05

5 ответов

Лучший ответ

Вы не можете использовать @Value для статических переменных. Вам нужно будет либо пометить его как нестатический, либо посмотреть, как вставить значения в статические переменные:

https://www.mkyong.com/spring/spring-inject-a-value-into-static-variables/

РЕДАКТИРОВАТЬ: На всякий случай, если ссылка разорвется в будущем. Вы можете сделать это, создав нестатический установщик для вашей статической переменной:

@Component
public class MyComponent {

    private static String directory;

    @Value("${filesystem.directory}")
    public void setDirectory(String value) {
        this.directory = value;
    }
}

Класс должен быть bean-компонентом Spring, иначе он не будет создан, а установщик не будет доступен Spring.

25
Plog 4 Сен 2017 в 08:14

Другие ответы, вероятно, верны для ОП.

Однако я столкнулся с теми же симптомами (@Value - аннотированные поля были null), но с другой основной проблемой:

import com.google.api.client.util.Value;

Убедитесь, что вы импортируете правильный класс аннотаций @Value! Особенно в связи с удобством IDE в настоящее время, это ОЧЕНЬ простая ошибка (я использую IntelliJ, и если вы выполняете автоматический импорт слишком быстро, не читая ЧТО вы автоматически импортируете, вы можете потратить несколько часов, как я).

Конечно, правильный класс для импорта:

import org.springframework.beans.factory.annotation.Value;

4
scottysseus 11 Дек 2018 в 17:15

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

    @RestController 
//or if you want to declare some specific use of the properties file then use
//@Configuration
//@PropertySource({"classpath:application-${youeEnvironment}.properties"})
public class PropertyController {

    @Value("${name}")//not necessary
    private String name;//not necessary

    private static String NAME_STATIC;

    @Value("${name}")
    public void setNameStatic(String name){
        PropertyController.NAME_STATIC = name;
    }
}
0
Vitalii Shramko 7 Май 2020 в 20:20

Несколько вещей для вас, чтобы перепроверить кроме ответа @ Plog.

Переменные static не могут быть введены со значением. Проверьте ответ @ Plog.

  • Убедитесь, что класс помечен @Component или @Service
  • Сканирование компонента должно сканировать прилагаемый пакет для регистрации бинов. Проверьте свой XML, если xml разрешил конфигурацию.
  • Проверьте правильность пути файла свойств или путь к классу.
6
Karthik R 4 Сен 2017 в 08:24

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

Это:

Вместо этого:

@Component
public MyBean {
   @Value("${properties.my-var}")
   private String myVar;

   private String anotherVar = foo(myVar); // <-- myVar here is still null!!!
}

Сделай это:

@Component
public MyBean {
   @Value("${properties.my-var}")
   private String myVar;

   private String anotherVar;

   @PostConstruct  
   public void postConstruct(){

      anotherVar = foo(myVar); // <-- using myVar after the bean construction
   }
}

Надеюсь, что это поможет кому-то избежать тратить часы.

2
Philippe Simo 11 Июн 2020 в 11:42