Воспроизведение 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, чтобы вставлять ваши ресурсы.