У меня есть два файла свойств в моем проекте загрузки 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
Пробовал как Autowiring, так и создание объекта с помощью new.
Автосвязывание должно работать, если это не сработает, ваша установка не работает, так как @Value просто никогда не будет null (если только она не указана по умолчанию). Если свойство не может быть разрешено, ваше приложение просто не запустится. Следовательно, я все еще думаю, что вы делаете new TestUtil вместо использования управляемого экземпляра spring.
Но позвольте мне вас удивить тем, что проект работает, и свойство разрешается, если вы ответите на мой вопрос, я могу получить доступ к значению свойства из другого класса.
Как уже говорилось, вы либо используете new TestUtil, либо неправильно настроили разрешение свойства. Я подозреваю, что первое... Однако вы не показываете, где вы используете TestUtil (и тот факт, что это утилита, заставляет меня задуматься, не забыли ли вы ключевое слово static в своем вопросе). Кроме того, ваше редактирование с помощью @Autowired не имеет @Component, что, в свою очередь, делает @Autowired бесполезным, если только у вас нет метода @Bean, создающего экземпляр.
Я отредактировал вопрос и предоставил фрагмент кода
Это только определение класса, оно не показывает использование TestUtil. Тот факт, что у вас есть @Autowired, не означает, что где-то в вашем коде по ошибке есть new TestUtil. Опять же, Spring не позволяет @Value оставаться нерешенным, он просто взорвется.. Здесь нет серой зоны. Следовательно, проблема заключается в вашем использовании класса.
Вы должны использовать @Component выше класса TestUtil. В противном случае Spring никогда не введет этот класс.
Ошибка устранена Я ответил на вопрос




используйте $ в именах свойств: например:
@Value("${prop.name}")
Вы пропустили знак доллара в аннотации Value. Это должно сделать работу:
@Value("${prop.name}")
Спасибо за быстрый ответ, но бесполезно пробовал то же самое, просто примечание. Он работает в другом классе, который у меня есть, и я получаю значение prop.name
Вы импортируете его из весны вместо, например, ломбока?
Попробуйте этот кусок кода
@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; И это работает нормально
Должны ли вы попытаться сделать строку примера, который вы вставили сюда, частной?
В вашем другом классе, в котором работает этот код, у вас также есть метод установки?
Нет, в классе, в котором он работает, нет метода установки
Я протестировал код, который дает вам нулевое значение, и он работает, как и ожидалось.
Вот в чем проблема: тот же самый фрагмент кода работает в другом моем классе. Я отредактировал вопрос и предоставил код другого класса, который работает нормально, но когда я пытаюсь сделать то же самое в TestUtil, он не работает
Давайте продолжить обсуждение в чате.
После комментариев M. Deinum проанализировал код и обнаружил, что первый класс, из которого я вызывал другой класс, не был автоматически подключен. Таким образом, после автоматического подключения класса это сработало. Большое спасибо @M.Deinum и всем пользователям, ответившим на мой вопрос.
Позвольте мне предположить, что вы делаете
new TestUtil()и ожидаете, что значение будет заполнено, вместо использования экземпляраTestUtil, управляемого пружиной.