JSF:将Object从一个backing-bean传递到另一个backing-bean

时间:2014-11-01 11:15:15

标签: java jsf java-ee cdi

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

无论如何我可以使用CDI注释并将一个backing-bean注入另一个,然后能够访问之前创建的对象吗?

举个例子,请参考下面的bean:

@Named
@ViewScoped
public RegisterController implements Serializable {

    User user = new User();

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

在上面的bean中创建对象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注释吗?

更新

好的,所以当我使用RegisterController注释注释SessionScoped时,我已经完成了上述工作,但是我不希望这个Bean注释SessionScoped,因为我可能会遇到更深入的问题轨道上的影响,例如田地的预先填充等等......任何想法如何以任何其他方式实现这一点?

2 个答案:

答案 0 :(得分:2)

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

请参阅here

答案 1 :(得分:0)

你可以在RegistrationController中使用:

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

并在PaymentController中:

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

这非常有用,您可以在地图中保存所需的对象。