web-dev-qa-db-ja.com

Play 2.5.3:依存性注入を使用して構成値を取得する

Playframeworkアプリケーションを2.4から2.5.3に移行しようとしていますが、_application.conf_ファイルから値を取得するのに問題があります。

Before_application.conf_からの値を取得するために私がしたことは:

_Play.application().configuration().getString("label")
_

現在Play.application()は非推奨であるため、依存性注入を使用する必要があります。 フレームワークドキュメント に基づいて、次の手順を使用します。

  1. インポートの定義:インポート_javax.inject.*; import play.Configuration;_
  2. クラスプロパティの定義:_@Inject private Configuration configuration;_
  3. クラスの構成クラスプロパティを使用します

コントローラでこれらの指示に従うと、_Application.Java_は完全に機能しています。

しかし、プロジェクトの他のクラスオブジェクトで使用しようとすると、依存性注入が機能せず、常にNullPointerExceptionが返されます。

依存性注入を使用して_application.conf_から値を取得する方法の例を誰かに教えてもらえますか?

DIを使おうとする私のJavaコードの一部:

_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")の行で常にnullポインタ例外が発生します

11
Miguel

同じ問題を抱えている人を助けるために、私はここに答えを置きました

私のエラーは、呼び出し元のクラスからZipper Javaクラスをインスタンス化するために使用した方法に起因していました。

Igmar Palsenbergに感謝し、彼は私に答えを提供しました: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!topic/play-framework/uLFqTM9_Iy4

Zipper zipTest = new Zipper();を使用してZipperクラスをインスタンス化し、Zipper zipTest =を使用する必要がありますインジェクター.instanceOf(Zipper.class);

3
Miguel

次のように構成を初期化できると思います。

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");
    }
}
6
asch

代わりにコンストラクタインジェクションを試してください。

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フィールドを挿入できるかどうかはわかりません。とにかく、コンストラクターインジェクションが推奨されるインジェクションタイプです。

3
marcospereira

privateを削除してみてください。使用する:

@Inject Configuration configuration;

の代わりに:

@Inject private  Configuration configuration;
1
Tony Hsieh

PlayがBeanを検出してリソースを注入できるように、クラスにSingletonアノテーションを付けるようにしてください。

0
Morshedian