2017-04-16 10 views
1

Scalaオブジェクトにプレイデータベースの依存関係を挿入する方法はありますか?データベースへの依存関係の挿入scalaオブジェクト

class MyClass @Inject() (db: Database) = { 
} 

などですが、実際にはPlayプラグインを使わずに依存関係を挿入したいと思っています。

マイbuild.sbtはこの

scalaVersion := "2.11.8" 

lazy val sparkVersion = "2.1.0" 

lazy val hadoopVersion = "2.7.0" 

lazy val jacksonVersion = "2.8.7" 

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % sparkVersion, 
    "org.apache.spark" %% "spark-sql" % sparkVersion, 
    "org.apache.hadoop" % "hadoop-common" % hadoopVersion, 
    "com.databricks" %% "spark-csv" % "1.5.0", 
    "org.codehaus.janino" % "janino" % "3.0.7", 
    "com.databricks" % "spark-redshift_2.11" % "3.0.0-preview1", 
    "com.amazonaws" % "aws-java-sdk-s3" % "1.11.34", 
    "com.typesafe" % "config" % "1.3.1", 
    "com.typesafe.play" % "play-json_2.11" % "2.4.6", 
    "com.typesafe.play" %% "play" % "2.5.9", 
    "com.typesafe.play" % "play-jdbc_2.11" % "2.5.14", 
    "com.amazon.redshift" % "jdbc42" % "1.2.1.1001" from "https://s3.amazonaws.com/redshift-downloads/drivers/RedshiftJDBC42-1.2.1.1001.jar" 
) 

fork in Test := true 

assemblyMergeStrategy in assembly := { 
    case ".gitkeep" => MergeStrategy.discard 
    case "META-INF/groovy-release-info.properties" => MergeStrategy.discard 
    case "META-INF/MANIFEST.MF" => MergeStrategy.discard 
    //case "log4j.properties" => MergeStrategy.deduplicate 
    case x: String if x.matches("""META-INF/.*\.(SF|DSA|RSA)""") => MergeStrategy.discard 
    case x: String if x.startsWith("META-INF/services/org.apache.lucene") => MergeStrategy.concat 
    case x => MergeStrategy.first 
} 

のように見える私は

object MyObject { 
@Inject() 
var db: Database = _ 
} 

を試みたが、nullポインタ例外

+0

私の謙虚な経験から、通常、あなたは 'オブジェクト'に状態を保存したくありません。したがって、メソッド呼び出しで渡す以外の方法で、オブジェクトに状態を注入する必要はありません。この方法で初期化の問題はなく、注入された依存関係の振る舞いを変更することに問題はなく、まだテスト可能です。 –

答えて

2

@Inject、この場合には動作しないことが失敗します。 Objectは言語レベルでシングルトンとして機能し、依存関係注入はコンフィグレーション駆動で、Playframeworkの場合はGuiceエンジンで構築されています。効果的にDIは、DIによって作成されたり挿入されたオブジェクトに対してのみ機能します。Guiceは、少なくともMyObjectの存在を認識する必要があります。

ベストオプションでは、そうでない場合は、あなたが(を非推奨となり、避けるべきである)Applicationオブジェクト

から Injectorの参照を取得することができます @Inject注釈

case class MyObject @Inject() (db: Database) 

でクラスを使用することです

object MyObject { 
    lazy val db: Database = Play.unsafeApplication.injector.instanceOf[Database] 
} 
+0

あなたが言ったようにInjectorを使用すると「アプリケーションが起動していません」というエラーが表示されます – hlagvankar

+0

アプリケーションを実行する必要があります。あなたはval dbの前に怠け者ですか? – mavarazy

+0

はい。実際にはPlayプラグインなしのSparkアプリケーションです。しかし、私は実際にbuild.sbtでPlayプラグインを有効にすることなく、データベースの注入、application.confの読み込み、環境などのPlay固有の機能を使いたいと思っています。これまでのところ私はConfigFactory I/O Configurationを使っています。 Playプラグインを使用せずにこれらを使用する方法はありますか? – hlagvankar

関連する問題