我想我想出了一个解决方案。
当我使用 CODI 时,我可以利用 ConversationGroup 注释。
我创建了一个 emtpy 接口 AddressConversation,然后将其添加到所有需要显示 address/addressEdit.xhtml 视图的支持 bean 以及 addressEdit 视图的支持 bean。
我也在使用 CODI 视图配置,所以我的操作方法返回 ViewConfig 派生类对象。
@Named
@ConversationScoped
@ConversationGroup(AddressConversation.class)
public class AddressView implements Serializable
{
private Class<? extends Views> fromView;
private Address editAddress;
private Address returnAddress;
// Getters/setters etc...
public Class<? extends Views> cancelEdit()
{
returnAddress = null;
return fromView;
}
}
所以在调用视图中我有 (PrimeFaces commandLink)
<p:commandLink value="#{enquiryView.addressLinkText}" action="#{enquiryView.editAddress()}" immediate="true"/>
在支持 bean EnquiryView 中,我可以在正确的对话组中 @Inject 一个 AddressView 的实例,然后在调用 action 方法时设置地址和返回视图属性。
@Named
@ConversationScoped
@ConversationGroup(AddressConversation.class)
public class EnquiryView implements Serializable
{
@Inject @ConversationGroup(AddressConversation.class) private AddressView addrView;
public Class<? extends Views> editAddress()
{
addrView.setAddress(editEnq.getAddress());
addrView.setFromView(Views.Enquiry.EnquiryEdit.class);
return Views.Address.AddressEdit.class;
}
}
我还可以观察EnquiryView 中的导航,并在地址编辑视图中“保存”地址时更新查询实体。
protected void onViewConfigNav(@Observes PreViewConfigNavigateEvent navigateEvent)
{
if (navigateEvent.getFromView() == Views.Address.AddressEdit.class &&
navigateEvent.getToView() == Views.Enquiry.EnquiryEdit.class)
{
onEditAddressReturn();
}
}
private void onEditAddressReturn()
{
if (addrView.getReturnAddress() != null) {
// Save pressed
editEnq.setAddress(addrView.getReturnAddress());
}
}