当前位置: 首页 > 知识库问答 >
问题:

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

阎昌勋
2023-03-14

这类似于@inject每次使用时都注入一个新实例,但我在那个线程中找不到答案。

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

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

宗沛
2023-03-14

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

 类似资料:
  • 当使用Spring Framework时,我怀疑在下面提到的场景中会创建多少实例: bean配置如下 默认情况下,bean“a”具有。因此,有一个单例bean引用了一个具有会话范围或原型范围的bean。 在这种情况下,如果有2个对应用程序的同时请求,那么将创建多少个A实例和多少个B实例? 如果有人能解释这是如何工作的,那将是非常有帮助的。 谢了达薇亚

  • org.openqa.selenium.SessionNotCreatedException:无法创建新会话。(原始错误:命令失败:C:\Windows\system32\cmd.exe/s/C“C:\Program Files(x86)\Android\Android sdk\platform tools\adb.exe”-s 69c7aa170104安装“C:\Program Files(x8

  • 问题内容: 我正在维护Java Web应用程序。 通过登录代码,它可以通过HttpServletRequest的getSession()方法从HttpServletRequest中获取一个HttpSession。(它在会话中使用一些值进行认证) 但是,我担心会话固定攻击,因此在使用初始会话后,我想开始一个新会话或更改会话ID。这可能吗? 问题答案: Servlet 3.0 API不允许您更改现有会

  • 我找了很多解决办法。谢了。

  • 我不知道这是否是实现我的解决方案的更好方法: 该类是可序列化的,因为我从数据库的Json中获取内容,并将内容映射到对象GetFromJson中(我只需要在数据库中执行一次查询)。因为这个原因,我需要在我所有的应用程序中使用对象,因为这个原因,我认为我需要使用一个单例 有人给我发布了一个库来从数据库中获取JSON。JSON对象解析为,因此我创建了我的类。 现在我有很多rest服务,在我的rest服务

  • 这是因为我在一个搜索字段上有一个失败的Behat测试-这个字段是通过javascript添加的,所以我假设Selenium(与我的设置)有问题。 我发现,如果我访问http://localhost:4444/wd/hub并单击“create Session”,选择任何浏览器(android、iphone、firefox、chrome、internet explorer、opera),我将得到错误消