2014-01-15 80 views
1

我正在将一个大的应用程序迁移到CDI和JPA。 在我可以更改所有代码之前,我需要知道以下模式是否可行。这将允许我部分迁移应用程序。我可以实例化一个指定的无状态bean吗?

我的托管Bean:

@Named 
@Stateless 
public class LanguageBoundary implements Serializable { 

    @Inject 
    LanguageService languageService; 

    @Inject 
    CrudService crudService; 

    public LanguageEntity findById(Long id) { 
     return crudService.find(LanguageEntity.class, id); 
    } 

...

我可以在任何其他类使用:

// Methods: DAO - Used by original deprecated parent wrapper class 
public LanguageEntity findByIdImpl(Id id) { 

    LanguageBoundary lb = new LanguageBoundary(); 
    return lb.findById(id.getValue()); 
} 

谢谢你的提醒。

回答

2

要做这样的事情,你需要获得对该对象的引用。你可以使用CDI来做到这一点。在CDI 1.1中,您可以获得CDI实用程序类。在CDI 1.0中,您可以使用JNDI获取对bean管理器的引用来执行相同的操作。看代码以供参考:https://github.com/apache/deltaspike/blob/master/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanProvider.java#L98

我很好奇你为什么使用@Named。你打算在你的UI中直接引用EJB吗?

+0

我和约翰一样好奇。 '@Named'通过EL声明一个可见的CDI bean,其中'@Stateless'声明一个EJB容器bean。分离担忧并不鼓励混合两者。另外,将EJB组件暴露给UI层并不是一个好习惯。 – Sam

4

如果你实例化它,bean不会被容器管理,所以它可能不是你想要的。相反,你应该注入它@Inject

相关问题