2016-03-23 22 views
1

この時点で、私は扱いにくい問題に取り組んでいます。私のAPIのために、私はPlayとAkkaの俳優を使いたいと思っていました。私が抱えている問題は、私の俳優に注入しようとするすべてのオブジェクトがnullのままであることです。 1つの解決策は、このオブジェクトをコントローラに挿入し、それを自分のアクタに渡すことですが、これは私がしたいことではありません。私は必要な場所にのみ私のオブジェクトが欲しい。注射された変数はUntypedActorで再生されます。再生2.5 java

package actors; 

import actors.Messages.GetAanleverAfspraakById; 
import akka.actor.UntypedActor; 

import model.domain.AanleverAfspraakDO; 
import play.db.jpa.JPAApi; 

import javax.inject.Inject; 
import javax.persistence.Query; 
import java.util.Collection; 

/** 
* Created by harms.h on 22-03-2016. 
*/ 
public class AfspraakActor extends UntypedActor { 
    @Inject 
    private JPAApi api; 

    @Override 
    public void onReceive(Object message) throws Exception { 
     if(message instanceof GetAanleverAfspraakById){ 
      final AanleverAfspraakDO aanleverAfspraakDO = this.getAanleverAfspraakDO(((GetAanleverAfspraakById) message).getId()); 
      getSender().tell(aanleverAfspraakDO, getSelf()); 
     } 
     else{ 
      unhandled(message); 
     } 
    } 

    private AanleverAfspraakDO getAanleverAfspraakDO(int id){ 
     final AanleverAfspraakDO aanleverAfspraakDO = api.withTransaction(() -> { 
      final Query query = api.em().createNamedQuery("findbyid").setParameter("id", id); 
      final Collection<AanleverAfspraakDO> resultSet = query.getResultList(); 
      final AanleverAfspraakDO result = resultSet.iterator().next(); 
      return result; 
     }); 

     return aanleverAfspraakDO; 
    } 
} 

私はここで間違っていますか?今の

答えて

4

私はこれがクリーンソリューションであれば皆さんはどう思いますかわからないんだけど、インターネット上

this.api = Play.current().injector().instanceOf(JPAApi.class); 

を長く、検索した後、次のコードを使用?

+0

ありがとうございます。私は同じ問題に遭遇し、何らかの理由でjpaapiが注入されていません。上記のステートメントは問題なく動作しており、今はブロック解除されています。 – Chaitanya

1

2.5を再生する:次のクラスを作成します。

import javax.inject.Inject; 
import akka.actor.Actor; 
import akka.actor.IndirectActorProducer; 
import akka.actor.UntypedActor; 
import play.api.Play; 

public class GenericDependencyInjector implements IndirectActorProducer { 

    final Class<? extends UntypedActor> actorClass; 

    @Inject 
    public GenericDependencyInjector(Class<? extends UntypedActor> actorClass) { 
     this.actorClass = actorClass; 
    } 

    @Override 
    public Class<? extends Actor> actorClass() { 
     return actorClass; 
    } 

    @Override 
    public Actor produce() { 
     return Play.current().injector().instanceOf(actorClass); 
    } 
} 

あなたが俳優を作成するときに、あなたのサービス・インターフェースと一緒にGenericDependencyInjectorを渡す:

final Props props = Props.create(GenericDependencyInjector.class, JPAApi.class); 
context().actorOf(props); 

今、あなたはあなたのサービスを注入できるはずです俳優に簡単に。

+0

それは動作し、より洗練されたソリューションです –

関連する問題