Просто переходите к JSF 2.2 и CDI 1.2 - впрыск будет как минимум проще.В соответствии с исходным ответом @BalusC:
import javax.enterprise.context.RequestScoped;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@RequestScoped
public class RequestBean {
@Inject
private SessionBean sessionBean;
// ...
@PostConstruct
void init() {
// Interact with sessionBean during construction
// but after Injection.
}
}
с
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@SessionScoped
public class SessionBean implements Serializable {
private SomeObject someVariable;
// ...
}
Необходимо сделать несколько важных замечаний - в частности, переход на @Named
и FullyКвалифицированное имя пакета для RequestScoped
и SessionScoped
.Также для создания класса SessionScoped
его также следует сделать Serializable
.
Добавление @Inject
делает его действительно простым - но следует понимать, что введенный объект sessionBean
доступен только после создания, а нев течение.Это означает, что у вас нет доступа к sessionBean
в конструкторе RequestBean
.Это решается путем использования @PostConstruct
, который запускается после завершения инъекции, а RequestBean
в противном случае полностью инициализируется.