Воспроизведение 2.5.3: Использование инъекции зависимостей для получения значений конфигурации
Я пытаюсь перенести приложение Playframework с 2.4 на 2.5.3, и у меня возникают проблемы с получением значений из application.conf
файла:
До, чтобы получить значение от application.conf
, что я делаю:
Play.application().configuration().getString("label")
Теперь, поскольку Play.application()
устарел, я должен использовать инъекцию зависимостей. Основываясь на документации по инфраструктуре, я использую следующие инструкции:
- Определить импорт: import
javax.inject.*; import play.Configuration;
- Определить свойство класса:
@Inject private Configuration configuration;
- Используйте свойство класса конфигурации в моем классе
Когда я следую этим инструкциям на моем контроллере Application.java
, он отлично работает:
Но когда я пытаюсь использовать его на другом объекте класса из моего проекта, инъекция зависимостей не работает, и я всегда получаю NullPointerException
.
Может ли кто-нибудь дать мне пример о том, как получить значения из application.conf
с помощью зависимости Injection?
Некоторая часть моего java-кода, где я пытаюсь использовать DI:
import javax.inject.Inject;
import play.Configuration;
import play.Logger;
public class Zipper {
@Inject private Configuration configuration;
public void unZip(String zipFilePath) {
Logger.debug("Display : zipFilePath"+zipFilePath);
Logger.debug("before call parameter from application.conf");
Logger.debug("configuration.getString = "+configuration.getString("Unzipedfile.path"));
Logger.debug("aftercall parameter from application.conf");
}
}
И я всегда получаю исключение с нулевым указателем, в строке с configuration.getString("Unzipedfile.path")
Ответы
Ответ 1
Я поставил здесь ответ, чтобы помочь кому-либо с той же проблемой
Моя ошибка возникла из-за того, как я использовал экземпляр Java-класса Zipper из моего вызывающего класса.
спасибо к Игмару Пальсенбергу, он дал мне ответ:
https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!topic/play-framework/uLFqTM9_Iy4
Я использовал Zipper zipTest = new Zipper();, чтобы стимулировать мой класс Zipper, и я должен использовать Zipper zipTest = injector.instanceOf(Zipper.class);
Ответ 2
Я думаю, что вы можете инициализировать конфигурацию следующим образом:
private Configuration configuration = Play.current().injector().instanceOf(Configuration .class);
Итак, ваша молния будет:
import javax.inject.Inject;
import play.Configuration;
import play.Logger;
public class Zipper {
private Configuration configuration = Play.current().injector().instanceOf(Configuration .class);
public void unZip(String zipFilePath) {
Logger.debug("Display : zipFilePath"+zipFilePath);
Logger.debug("before call parameter from application.conf");
Logger.debug("configuration.getString = "+configuration.getString("Unzipedfile.path"));
Logger.debug("aftercall parameter from application.conf");
}
}
Ответ 3
Попробуйте вместо инъекции конструктора:
import javax.inject.Inject;
import play.Configuration;
import play.Logger;
public class Zipper {
private Configuration configuration;
@Inject
public Zipper(Configuration config) {
this.configuration = config;
}
public void unZip(String zipFilePath) {
Logger.debug("Display : zipFilePath"+zipFilePath);
Logger.debug("before call parameter from application.conf");
Logger.debug("configuration.getString = "+configuration.getString("Unzipedfile.path"));
Logger.debug("aftercall parameter from application.conf");
}
}
Я не уверен, что Guice способен вводить поля private
. Во всяком случае, инъекция конструктора является рекомендуемым типом инъекции.
Ответ 4
вам следует попытаться удалить private
.
Применение:
@Inject Configuration configuration;
вместо:
@Inject private Configuration configuration;
Ответ 5
Попробуйте аннотировать свой класс с помощью Singleton, чтобы игра могла обнаружить ваш bean, чтобы вставлять ваши ресурсы.