所以我有三个 CDI Managed Beans ,其中两个我注入loginMB
所以我可以在其中使用Session
属性,但是他们都扔NullPointerException
:
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
@Named(value = "loginMB")
@SessionScoped
public class LoginMB implements Serializable{
private NomadUser usuarioEnSession;
private UserSettings configuracionUsuarioEnSession;
public void login(){}
// login method ....
// where I already verified that both usuarioEnSession & config... != null
}
MB 1:
@Named(value = "fotoPerfilMB")
@RequestScoped
public class FotoPerfilMB implements Serializable {
@ManagedProperty(value = "#{loginMB}")
private LoginMB loginMB;
@PostConstruct
public void init(){
// this throws NullPOinterException
loginMB.getConfiguracionUsuarioEnSession();
}
}
MB 2:
@Named(value = "imagenesMB")
@RequestScoped
public class ImagenesMB implements Serializable {
@ManagedProperty(value = "#{loginMB}")
private LoginMB loginMB;
@EJB
private UserImagesFacade servicioImagenes;
private int idUsuarioEnSession;
private NomadUser usuarioEnSession;
private List<UserImages> listaImagenes;
@PostConstruct
public void init() {
try {
usuarioEnSession = loginMB.getUsuarioEnSession();
idUsuarioEnSession = usuarioEnSession.getId();
listaImagenes = servicioImagenes.listaImagenes(idUsuarioEnSession);
} catch (NullPointerException e) {
// this is allways thrown
System.err.println("loginMB is null");
}
}
正如您所看到的,我一直在玩try-catch
语句,打印ManagedProperty
值,但我似乎无法理解为什么 null ,这是堆栈跟踪。提前谢谢。
当我删除try-catch
语句时会发生这种情况,并且我理解它,因为Exception
方法中有@postConstruct
,我现在NullPointerException
来自loginMB ManagedProperty
org.jboss.weld.exceptions.WeldException: WELD-000049:
Unable to invoke public void co.nomad.managedBeans.FotoPerfilMB.init()
on co.nomad.managedBeans.FotoPerfilMB@672d4b74
答案 0 :(得分:0)
这很正常,你将CDI注释与JSF注释混合在一起。
这是一件坏事,因为JSF保留了自己的托管bean容器,CDI几乎完全相同。这种设置最多会导致奇怪的行为。
我建议坚持使用CDI注释或在托管bean中仅使用JSF注释,并将Spring用于其他bean,例如服务或其他。