Jsf 在不同的@Named Bean中注入相同的@SessionScoped Bean

Jsf 在不同的@Named Bean中注入相同的@SessionScoped Bean,jsf,cdi,Jsf,Cdi,我有一个小javaeewebproject,我需要在其中注入bean。我有一个启用cdi的tomee服务器。这里有一个小测试用例 这是我的@SessionScoped用户对象 import javax.enterprise.context.SessionScoped; import java.io.Serializable; @SessionScoped public class User implements Serializable { String userName;

我有一个小javaeewebproject,我需要在其中注入bean。我有一个启用cdi的tomee服务器。这里有一个小测试用例

这是我的@SessionScoped用户对象

import javax.enterprise.context.SessionScoped;
import java.io.Serializable;

@SessionScoped
public class User implements Serializable {
    String userName;

    public User () {}
    public User (String userName) { this.userName = userName; }

    public String getUserName() { return userName; }
    public void setUserName(String userName) { this.userName = userName; }
}
这是我的两颗几乎一模一样的豆子:

@Named
@RequestScoped
public class BeanOne {
    private String message;
    @Inject User user;

    @PostConstruct
    public void init() { user = new User("TestName"); }

    public String getMessage() { return user.getUserName(); }
}
在这个bean中,我创建了一个新用户。getMessage方法返回正确的用户名。我认为用户应该仍然存在于第二个bean中,因为它的@SessionScoped。这是我的第二粒豆子

@Named
@RequestScoped
public class BeanTwo {
    private String message;
    @Inject User user;      

    public String getMessage() { return user.getUserName(); }
}

但是在这个bean中,user.getUserName()返回null。我应该如何注入@SessionScoped bean?

这是因为您在
BeanOne
init方法中手动初始化了
user
对象。依赖项注入的目的是让某些容器为您创建对象实例,因此您永远不应该手动初始化对象。所以,只需为这个用户设置一个名称,它就会在会话期间对所有其他bean可见

@PostConstruct
public void init() { user.setUserName("TestName"); }

只是好奇为什么这被否决了?我认为这是一个很好的问题。投票支持:)我对JavaEE还不熟悉,但批评我的研究工作是完全错误的。我对此进行了数小时的研究,所有与JavaEE相关的文档都是不存在的,或者如果您没有先验知识,那么很难理解,并且注释是“神奇的”。为什么这仅仅是因为我使用了@products,它只是另一个注释,但确实有效。所以,请不要只是假设你不可能知道的事情,巴卢斯…谢谢,这是可行的。它还与@products方法一起工作。