【问题标题】:@Inject create a new bean instance in the session@Inject 在会话中创建一个新的 bean 实例
【发布时间】:2014-05-26 10:30:21
【问题描述】:

它类似于@Inject is injecting a new instance every time i use it,但我在那个帖子中找不到答案。

我对 CDI 和 JSF 都很陌生,我正在尝试使用 CDI 而不是 JSF 注释。 我想从 MemberController 中检索凭据。 bean 本身(两者)都是从 jsf 页面调用的。问题是 MemberController 中的 Credential 实例始终具有空名称/密码,即使我确认 Credential 中的设置器被命中。我不明白为什么有两个凭据实例。我可以通过@ManagedBean+@ManagedProperty 得到我想要的。但我想知道如何用 CDI 做同样的事情。

我的环境是 JBoss 7.1.1+Java EE 6

凭据.Java

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

@Named
@SessionScoped
public class Credential implements Serializable{
    private static final long serialVersionUID = 680524601336349146L;

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    private String password;
}

MemberController.Java

@Named
@SessionScoped
public class MemberController implements Serializable {
    private static final long serialVersionUID = 8993796595348082763L;

    @Inject
    private Credential newCredential;

    public void login() {
        String msg = newCredential.getName()+":"+newCredential.getPassword();
    }
}

JSF 页面段

<p:inputText id="username" label="Username" value="#{credential.name}" />
<p:password id="password" label="Password" value="#{credential.password}" />
<p:commandButton value="Login" action="members" actionListener="#{memberController.login}" />

【问题讨论】:

    标签: java jsf jboss7.x cdi


    【解决方案1】:

    注入不会调用新实例(第一次被调用,或者注入的 bean 有一个 requestscope)。这取决于您用于 bean 的范围。您使用的 Scope 将为使用您的应用程序的每个人生成一个新 bean(他们自己的 sessionscope bean)。此范围内的数据仅对此人可见。如果您希望应用程序的所有用户都可以访问该应用程序的全局容器,并且每个人都包含相同的数据,那么您应该创建一个应用程序范围或单例 bean。使用此注解,您可以创建一个在应用程序生命周期内可供所有人访问的容器,作为保存数据的中心点。

    【讨论】:

    • 嗨,安迪,感谢您的 cmets,我在那里花了几个小时,终于发现我被 Eclipse 愚弄了,调试窗口显示空值,但实际上它是针对注入代理的。这些价值观已经存在了很长时间:)
    猜你喜欢
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多