【问题标题】:inject the same @SessionScoped Bean in different @Named Beans在不同的 @Named Bean 中注入相同的 @SessionScoped Bean
【发布时间】:2014-07-20 19:12:08
【问题描述】:

我有一个小的 javaee webproject,我需要在其中注入 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。这是我的第二个 bean。

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

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

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

【问题讨论】:

  • 只是好奇为什么这被否决了?我认为这是一个很好的问题。投票支持:)
  • 我是 java-ee 的新手,但批评我的研究工作是完全错误的。我研究了几个小时,如果您没有先验知识并且注释是“神奇的”,那么与 java-ee 相关的所有内容的文档都不存在或很难理解。为什么这只能工作,因为我使用 @Produces 这只是另一个注释,但它确实有效。所以请不要只是假设你不可能知道 BalusC 的事情......

标签: jsf cdi


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这行得通。它也适用于 @Produces 方法。
猜你喜欢
  • 2016-12-04
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
相关资源
最近更新 更多