Невозможно прочитать значения из файла свойств с помощью @value или с помощью Autowired to Enviroment

У меня есть два файла свойств в моем проекте загрузки Spring. И я могу читать свойства обоих в одном классе. Но то же самое значение, когда я пытаюсь прочитать из другого класса, используя @Value или Autowired Environment, дает мне значение null.

    prop.name=test /*   property file value */

    @Component
    public class TestUtil { // This is the class giving me null value

        @Value("${prop.name}")
        String st;

        public String getTestString()
        {
            System.out.println(st+ " ***");
            return st;

        }
    }

//Using @Autowired Enviroment
public class TestUtil {

    @Autowired
    private Environment env;


    public String getTestString()
    {
        System.out.println(env.getProperty("prop.name")+ " ***");
        return env.getProperty("prop.name");

    }
}

/* Class below giving me value from properties file*/

        public class JsonWriter extends JsonResponseWriter {

        @Value("${prop.name}")
        private String contentsMenus;

      /* Some method*/
       System.err.println("from JsonWriter  "+contentsMenus);

Вот я занимаюсь автопроводкой

@Service
public class ResponseUtil {
    @Autowired
     private TestUtil util ;

В приведенном выше классе я использую autowired

Позвольте мне предположить, что вы делаете new TestUtil() и ожидаете, что значение будет заполнено, вместо использования экземпляра TestUtil, управляемого пружиной.

M. Deinum 15.04.2019 10:25

Пробовал как Autowiring, так и создание объекта с помощью new.

Aman Vyas 15.04.2019 10:41

Автосвязывание должно работать, если это не сработает, ваша установка не работает, так как @Value просто никогда не будет null (если только она не указана по умолчанию). Если свойство не может быть разрешено, ваше приложение просто не запустится. Следовательно, я все еще думаю, что вы делаете new TestUtil вместо использования управляемого экземпляра spring.

M. Deinum 15.04.2019 10:42

Но позвольте мне вас удивить тем, что проект работает, и свойство разрешается, если вы ответите на мой вопрос, я могу получить доступ к значению свойства из другого класса.

Aman Vyas 15.04.2019 10:44

Как уже говорилось, вы либо используете new TestUtil, либо неправильно настроили разрешение свойства. Я подозреваю, что первое... Однако вы не показываете, где вы используете TestUtil (и тот факт, что это утилита, заставляет меня задуматься, не забыли ли вы ключевое слово static в своем вопросе). Кроме того, ваше редактирование с помощью @Autowired не имеет @Component, что, в свою очередь, делает @Autowired бесполезным, если только у вас нет метода @Bean, создающего экземпляр.

M. Deinum 15.04.2019 10:45

Я отредактировал вопрос и предоставил фрагмент кода

Aman Vyas 15.04.2019 10:51

Это только определение класса, оно не показывает использование TestUtil. Тот факт, что у вас есть @Autowired, не означает, что где-то в вашем коде по ошибке есть new TestUtil. Опять же, Spring не позволяет @Value оставаться нерешенным, он просто взорвется.. Здесь нет серой зоны. Следовательно, проблема заключается в вашем использовании класса.

M. Deinum 15.04.2019 10:53

Вы должны использовать @Component выше класса TestUtil. В противном случае Spring никогда не введет этот класс.

Σωτήρης Ραφαήλ 15.04.2019 11:33

Ошибка устранена Я ответил на вопрос

Aman Vyas 15.04.2019 11:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
9
681
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

используйте $ в именах свойств: например:

@Value("${prop.name}")

Вы пропустили знак доллара в аннотации Value. Это должно сделать работу:

@Value("${prop.name}")

Спасибо за быстрый ответ, но бесполезно пробовал то же самое, просто примечание. Он работает в другом классе, который у меня есть, и я получаю значение prop.name

Aman Vyas 15.04.2019 09:21

Вы импортируете его из весны вместо, например, ломбока?

Andronicus 17.04.2019 16:32

Попробуйте этот кусок кода

@Component
public class TestUtil {

@Autowired
private Environment env;


  public String getTestString(){
    System.out.println(env.getProperty("prop.name")+ " ***");
    return env.getProperty("prop.name");

  }
}

Спасибо, Σωτήρης Ραφαήλ, но это не работает. Я получаю значение, используя оба способа в другом классе, который у меня есть. Открытый класс JsonWriter extends JsonResponseWriter { @Value("${prop.name}") private StringcontentsMenus; И это работает нормально

Aman Vyas 15.04.2019 10:16

Должны ли вы попытаться сделать строку примера, который вы вставили сюда, частной?

Σωτήρης Ραφαήλ 15.04.2019 10:18

В вашем другом классе, в котором работает этот код, у вас также есть метод установки?

Σωτήρης Ραφαήλ 15.04.2019 10:19

Нет, в классе, в котором он работает, нет метода установки

Aman Vyas 15.04.2019 10:21

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

Σωτήρης Ραφαήλ 15.04.2019 10:28

Вот в чем проблема: тот же самый фрагмент кода работает в другом моем классе. Я отредактировал вопрос и предоставил код другого класса, который работает нормально, но когда я пытаюсь сделать то же самое в TestUtil, он не работает

Aman Vyas 15.04.2019 10:40

Давайте продолжить обсуждение в чате.

Aman Vyas 15.04.2019 10:44
Ответ принят как подходящий

После комментариев M. Deinum проанализировал код и обнаружил, что первый класс, из которого я вызывал другой класс, не был автоматически подключен. Таким образом, после автоматического подключения класса это сработало. Большое спасибо @M.Deinum и всем пользователям, ответившим на мой вопрос.

Другие вопросы по теме