繁体   English   中英

CDI @Named bean 中的 @javax.faces.bean.ManagedProperty 返回 null

[英]@javax.faces.bean.ManagedProperty in CDI @Named bean returns null

我正在尝试处理@javax.faces.bean.ManagedProperty但没有成功!

我一直在遵循指南,这似乎并不难。 但我的代码根本行不通!

这是一个小片段

@ManagedBean
@SessionScoped
public class LoginBean {

    private User user;

    // ...
}
@Named
@RequestScoped
public class MessagesBean {

    @ManagedProperty(value = "#{loginBean}")
    private LoginBean loginBean;

    public String getUser() {
        System.err.println(loginBean == null);
        return loginBean.getUser().getUsername();
    }

    // ...
}

这段代码给了我一个NullPointerException ,说loginBean是空的!

有什么建议吗?

您将 JSF 托管 bean 与 CDI bean 混合使用。 您的LoginBean是一个 JSF 托管 bean(它具有@ManagedBean批注)。 您的MessageBean是一个 CDI bean(它有@Named注释)。 如果您将 Message bean 更改为 JSF 托管 bean(将@Named替换为@ManagedBean ),那么应该可以解决问题(它也应该适用于两个 CDI bean)。 或者,如果您使用的是 JSF 2.3 或更新版本,则在 CDI bean 中使用javax.faces.annotation.ManagedProperty代替。

以下是两种 bean 类型之间注入如何工作的简短概述:

CDI @Named --> CDI @Named(作品)

CDI @Named --> JSF @ManagedBean(仅当注入的 bean 范围更广时才有效)

JSF @ManagedBean --> JSF @ManagedBean(仅当注入的 bean 范围更广时才有效)

JSF @ManagedBean --> CDI @Named(不起作用)

但要注意范围导入类。 根据 bean 类型, @SessionScoped@RequestScoped有不同的类。

@ManagedBeans 的javax.faces.bean.SessionScoped

用于 CDI @Named bean 的javax.enterprise.context.SessionScoped

此外,对于@Named (CDI) 使用@Inject ,对于@ManagedBean使用@ManagedProperty 有一件事在 CDI 中不起作用。 您的@ManagedProperty(value = "#{loginBean}")获得了一个完整的 bean,但是@ManagedProperty(value = "#{loginBean.user}")获得了一个 bean 的“属性”。 这在带有@Inject CDI 中是不可能直接实现的。 有关“解决方案”,请参阅@ManagedProperty 的 CDI 替换

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM