@Inject在会话中创建一个新的bean实例

时间:2014-04-12 05:45:50

标签: java jsf jboss7.x cdi

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

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

我的环境是JBoss 7.1.1 + Java EE 6

Credential.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}" />

1 个答案:

答案 0 :(得分:1)

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