2015-09-25 54 views
0

假設我有一個EJB。如何控制來自客戶端的CMT注入?

@Stateless 
public class PersistenceService { 

    @PersistenceContext(unitName="dependent") 
    private transient EntityManager entityManager; 
} 

有什麼辦法來控制從客戶unitName價值?

@RequestScoped 
@Path("/persistence") 
public class PersistenceResource { 

    //"some" 
    @Inject 
    private transient PersistenceService somePU; 

    //"other" 
    @Inject 
    private transient PersistenceService otherPU; 
} 

回答

1

1)爲您的PU創建2個CDI qualifiers

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD}) 
public @interface SomePC { 
} 

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD}) 
public @interface OtherPC { 
} 

2)然後暴露你的PU作爲CDI豆

@ApplicationScoped 
public class EntityManagerProducer { 


@Produces 
@PersistenceContext(unitName = "somePU") 
@SomePC 
private EntityManager em; 

@Produces 
@PersistenceContext(unitName = "otherPU") 
@OtherPC 
private EntityManager em; 
} 

3)在服務注入兩個新興市場:

@Stateless 
public class PersistenceService { 

    @Inject 
    @SomePC 
    private emSome; 

    @Inject 
    @OtherPC 
    private emOther; 

    public SeomthingUseful doSomething(Context myContext){ 
     getEntityManager(myContext); 
     ... 
    } 

    private EntityManager getEntityManager(Context myContext){ 
     if(myContext == SOME_PU) 
     return emSome; 
     return emOther; 
    } 
} 

4)從你的客戶,你可以通過將用於選擇合適的PU上下文(你也可以用於此目的創建RequestScoped豆,在這種情況下,你不必使用方法PARAM):

@RequestScoped 
@Path("/persistence") 
public class PersistenceResource { 

    @Inject 
    PersistenceService service; 

    public void myMethod(){ 
     service.doSomething(myContext.SOME_PU); 
    } 


} 

上下文可以是您需要的不同值的枚舉(SOME_PU,OTHER_PU)。作爲替代,你可以動態地做所有注入新興豆在您的服務如下:

@Inject @Any Instance<EntityManager> emSource; 

如果按照這個路徑,然後一切都解釋here