其他Managed Beans中带有CDI Managed Beans的ManagedProperty为null

时间:2015-11-24 20:31:02

标签: java cdi jsf-2.2

所以我有三个 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语句时会发生这种情况,并且我理解它,因为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

1 个答案:

答案 0 :(得分:0)

这很正常,你将CDI注释与JSF注释混合在一起。

这是一件坏事,因为JSF保留了自己的托管bean容器,CDI几乎完全相同。这种设置最多会导致奇怪的行为。

我建议坚持使用CDI注释或在托管bean中仅使用JSF注释,并将Spring用于其他bean,例如服务或其他。