Как внедрить bean-компонент в EJB 3.1 до запуска конструктора класса? - PullRequest
6 голосов
/ 07 октября 2011

У меня есть Фасад, в котором есть единица постоянства.И мне нужно, чтобы Facade и его зависимости были инициализированы до запуска Конструктора RoleController, возможно ли в 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 Ответ

11 голосов
/ 07 октября 2011

Обычно плохая идея выполнять какую-либо логику в конструкторе (не только на EJB-площадке). Используйте @PostConstruct вместо:

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

С этой аннотацией контейнер сначала создает экземпляр объекта EJB, JVM запускает (пустой) конструктор, контейнер через отражение вводит зависимости, а когда все готово, вызывает все методы, отмеченные @PostConstruct, в неуказанном порядке. Теперь EJB готов обслуживать запросы.

Я думаю, что некоторые контейнеры / более новые спецификации EJB допускают внедрение конструктора, но я никогда не использовал его.

...