如何在类构造函数运行之前使用EJB 3.1注入Bean?

时间:2011-10-07 19:51:18

标签: java dependency-injection ejb ejb-3.0 ejb-3.1

我有一个具有持久性单元的Facade。我需要Facade并在RoleController Conconstructor运行之前初始化它的依赖项,在EJB 3.1中是否可以这样做?

在Spring中,你可以简单地将一些参数(preConstruction =“true”)添加到@configurable中,然后就完成了。

但是在EJB中我找不到办法,我总是得到一个NullPointer ......

@FacesConverter("rolesConverter")
@Named("roleController")
@SessionScoped
@TransactionManagement(TransactionManagementType.CONTAINER)
public class RoleController implements Serializable, Converter{

    private List<Roles> listOfRoles; 
    private List<Roles> listChoosenRoles;
    private DualListModel<Roles> listOfDualRoles;
    @EJB
    private RoleFacade roleFacade;

    public RoleController(){
        listOfRoles = roleFacade.getListOfRoles();
        listChoosenRoles = new ArrayList();
        listOfDualRoles = new DualListModel<Roles>(listOfRoles, listChoosenRoles);
    }

1 个答案:

答案 0 :(得分:11)

在构造函数中执行任何逻辑通常都是一个坏主意(不仅仅是在EJB操场上)。请改用@PostConstruct

@PostConstruct
public init(){
    listOfRoles = roleFacade.getListOfRoles();
    listChoosenRoles = new ArrayList();
    listOfDualRoles = new DualListModel<Roles>(listOfRoles, listChoosenRoles);
}

使用此批注,容器将首先实例化一个EJB对象,JVM运行一个(空)构造函数,通过反射注入依赖关系的容器,当一切准备就绪时,调用所有以@PostConstruct注释的方法,这些方法都是未指定的顺序。现在,EJB已准备好为请求提供服务。

我认为一些容器/更新的EJB规范允许构造函数注入,但我从未使用它。