【问题标题】:ManagedProperty with CDI Managed Beans is null in other Managed BeansCDI 托管 Bean 的 ManagedProperty 在其他托管 Bean 中为空
【发布时间】:2015-11-24 20:31:01
【问题描述】:

所以我有三个 CDI 托管 Bean,在其中两个中我注入了 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,而我现在从loginMB ManagedProperty 中得到NullPointerException

org.jboss.weld.exceptions.WeldException: WELD-000049:
Unable to invoke public void co.nomad.managedBeans.FotoPerfilMB.init()
on co.nomad.managedBeans.FotoPerfilMB@672d4b74

【问题讨论】:

    标签: java cdi jsf-2.2


    【解决方案1】:

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

    这是一件坏事,因为 JSF 保留了自己的托管 bean 容器,而 CDI 的做法几乎相同。这种设置充其量只会导致奇怪的行为。

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

    【讨论】:

    • 我也试过 @Inject 而不是 @managedProperty 但我得到了相同的结果。 ¿ 你指的是除此之外的东西吗?你能说得更具体些吗?
    猜你喜欢
    • 2012-08-27
    • 2023-03-07
    • 2016-07-09
    • 2015-04-20
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2015-08-06
    相关资源
    最近更新 更多