2016-03-23 13 views
1

Şu anda zor bir problemle uğraşıyorum. API'm için Play ve Akka aktörünü kullanmayı umuyordum. Sahip olduğum problem, Aktörüme enjekte etmeye çalıştığım her nesnenin boş kalması. Bir çözüm bu nesneyi denetleyiciye enjekte etmektir ve onu aktörümden geçirmektir ama yapmak istediğim şey bu değil. Nesnemi sadece ihtiyacım olan yere istiyorum.Enjekte edilen değişkenler null içinde UntypedActor Play 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; 
    } 
} 

Burada yanlış yapıyorum? Şimdilik

cevap

4

internette

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

bu çocuklar sizce ne temiz çözüm olup olmadığından emin değilim üzerinde uzun bir aramadan sonra aşağıdaki kodu kullanılır?

+0

Bunun için teşekkürler. Aynı konuya koştum ve jpaapi herhangi bir nedenle enjekte edilmiyor. Yukarıdaki açıklama iyi çalışıyor ve şimdilik engellemeyi kaldırdım. – Chaitanya

1

2.5 oynayın: Aşağıdaki sınıf oluşturun:

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

Artık hizmetlerini enjekte gerekir: Sonra

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); 
    } 
} 

Eğer aktör oluştururken, Servis Arayüzü ile birlikte GenericDependencyInjector geçmesi kolaylıkla oyuncuya.

+0

Çalışıyor ve daha zarif bir çözüm. –

İlgili konular