【问题标题】:JSF : Passing an Object from one backing-bean to another backing-beanJSF:将一个对象从一个支持bean传递到另一个支持bean
【发布时间】:2014-12-28 14:31:03
【问题描述】:

我正在尝试为我在开发小型应用程序时遇到的一个小问题找出解决方案。我试图传递一个在一个支持 bean 中创建的对象,然后使用我在另一个支持 bean 中创建的同一个对象。但是,我不想让这些 backing-beans @SessionScoped,并且最好不要使用 @ManagedBean,因为我正在为我的 JavaEE 应用程序使用 CDI

我是否可以使用CDI 注释并将一个支持bean 注入另一个支持bean,然后能够访问先前创建的对象?

例如,参考下面的 bean:

@Named
@ViewScoped
public RegisterController implements Serializable {

    User user = new User();

    // Getter and Setter methods which are populated by the JSF page
}

获取在上述 bean 中创建的 Object User 并在下面的控制器中使用它:

@Named
@ViewScoped
public PaymentController implements Serializable {

    @Inject RegisterController registerController; // Injecting bean

    registerController.getUser().getName(); //this is null when I try access the properties of the object 'User'. I am assuming this is because @ViewScoped annotated on the 'RegisterController' class? 

    // I would like to use the User object created in 'RegisterController' here an access properties etc...
}

我可以使用 CDI 提供的 @Inject 注释吗?

更新

好的,所以当我用SessionScoped 注释注释RegisterController 时,我已经完成了上述工作,但是我不希望这个Bean 注释SessionScoped,因为我可能会在跟踪过程中遇到进一步的影响,例如作为字段的预填充等...有什么想法可以以其他方式实现吗?

【问题讨论】:

  • @SalihErikci, @RequestScoped CDI 注释将不起作用,因为对象的持续时间必须比单个 HTTP Request 更长。

标签: java jsf jakarta-ee cdi


【解决方案1】:

你可以在RegistrationController中使用:

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("user", user);

在 PaymentController 中:

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");

这个很有用,你可以把你想要的对象保存在地图里。

【讨论】:

    【解决方案2】:

    嗯,@ViewScoped 太短了,@SessionScoped 太长了。那为什么不用@ConversationScoped呢?

    here

    【讨论】:

    • 我已经使用 CDI @ConversationScoped 实现了这个。感谢您的来信。
    猜你喜欢
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2011-10-13
    • 2012-03-25
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多