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
}

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,例如服务或其他。