CDI @Named bean 中的 @javax.faces.bean.ManagedProperty 返回 null [英] @javax.faces.bean.ManagedProperty in CDI @Named bean returns null

查看:34
本文介绍了CDI @Named bean 中的 @javax.faces.bean.ManagedProperty 返回 null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我一直在关注这个 指导,这似乎并不难.但我的代码根本行不通!

这是一个小片段

@ManagedBean@SessionScoped公共类 LoginBean {私人用户用户;//...}

@Named@RequestScoped公共类 MessagesBean {@ManagedProperty(value = "#{loginBean}")私有 LoginBean loginBean;公共字符串 getUser() {System.err.println(loginBean == null);返回 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 或更新版本,则使用 javax.faces.annotation.ManagedProperty 而不是在 CDI bean 中.

以下简要概述了两种 bean 类型之间的注入工作原理:

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

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

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

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

但是要注意作用域导入类.@SessionScoped@RequestScoped 有不同的类,具体取决于 bean 类型.

<块引用>

javax.faces.bean.SessionScoped 用于@ManagedBeans

<块引用>

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

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

I'm trying to deal with @javax.faces.bean.ManagedProperty but without success !

I've been following this guide, and it not seems that hard. But my code simply won't work!

Here's a little snippet

@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();
    }

    // ...
}

This code gives me a NullPointerException, saying that loginBean is null!

Any suggestion?

解决方案

You are mixing JSF managed beans with CDI beans. Your LoginBean is a JSF managed bean (it has the @ManagedBean annotation). Your MessageBean is a CDI bean (it has the @Named annotation). If you changed the Message bean to a JSF managed bean (replacing @Named with @ManagedBean) then the problem should be solved (It should work with two CDI beans as well). Or if you're using JSF 2.3 or newer, then use javax.faces.annotation.ManagedProperty instead in the CDI bean.

Here is a short overview of how injection works between both bean types:

CDI @Named --> CDI @Named (works)

CDI @Named --> JSF @ManagedBean (works only if scope of injected bean is broader)

JSF @ManagedBean --> JSF @ManagedBean (works only if scope of injected bean is broader)

JSF @ManagedBean --> CDI @Named (won't work)

But take care of the scope import classes. There are different classes for @SessionScoped and @RequestScoped depending on the bean type.

javax.faces.bean.SessionScoped for @ManagedBeans

javax.enterprise.context.SessionScoped for CDI @Named beans

In addition, for @Named (CDI) use @Inject and for @ManagedBean use @ManagedProperty. There is one thing that does not work in CDI. Your @ManagedProperty(value = "#{loginBean}") gets a full bean, but @ManagedProperty(value = "#{loginBean.user}") to get a 'property' of a bean works to. This is not directly possible in CDI with @Inject. See CDI Replacement for @ManagedProperty for a 'solution'

这篇关于CDI @Named bean 中的 @javax.faces.bean.ManagedProperty 返回 null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆