CDI Managed Beans 的 ManagedProperty 在其他 Managed Beans 中为 null
ManagedProperty with CDI Managed Beans is null in other Managed Beans
所以我有三个 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
}
- 两者都有 ManagedProperty 的设置器
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
语句时会发生这种情况,我理解它是因为在 @postConstruct
方法中抛出了一个 Exception
,我现在从 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
这很正常,您将 CDI 注释与 JSF 注释混合在一起。
这是一件坏事,因为 JSF 保留其自己的托管 bean 容器,而 CDI 的做法几乎相同。这种设置最多会导致奇怪的行为。
我建议在托管 bean 中坚持使用 CDI 注释或仅使用 JSF 注释,而将 Spring 用于其他 bean,例如服务或其他。
所以我有三个 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
}
- 两者都有 ManagedProperty 的设置器
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
语句时会发生这种情况,我理解它是因为在 @postConstruct
方法中抛出了一个 Exception
,我现在从 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
这很正常,您将 CDI 注释与 JSF 注释混合在一起。
这是一件坏事,因为 JSF 保留其自己的托管 bean 容器,而 CDI 的做法几乎相同。这种设置最多会导致奇怪的行为。
我建议在托管 bean 中坚持使用 CDI 注释或仅使用 JSF 注释,而将 Spring 用于其他 bean,例如服务或其他。