@javax.faces.bean.ManagedProperty in CDI @Named bean returns



我试图处理@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注释(。如果将消息 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(不起作用(

但请注意范围导入类。根据豆类的不同,@SessionScoped@RequestScoped有不同的类。

javax.faces.bean.SessionScoped@ManagedBeans

CDI @Named豆javax.enterprise.context.SessionScoped

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

相关内容

  • 没有找到相关文章

最新更新