primefaces,延迟加载datatable和jsf @conversation范围bean

时间:2012-04-02 19:33:17

标签: primefaces cdi

我使用的是primefaces 3.2和mojarra 2.1.7和jboss 6.1。我正在尝试构建一个延迟加载数据表。在其中一个数据表列中,我有一个命令链接来调用编辑方法。如果我的bean是会话作用域,则不会调用edit方法。如果它是视图范围,那么它将被调用。我不能使用一个会话范围的bean来处理延迟加载数据表吗?

@Named("userBean")
@Stateful
@ConversationScoped
@LoggedIn
public class UserBean implements Serializable, UserBeanLocal {

   private static final long serialVersionUID = 1L;

   @Inject
   private Conversation conversation;
   @EJB
   private UserManagerBeanLocal userController;
   @Inject
   private transient FacesContext context;

   private User user;

   private LazyUserDataModel lazyModel;

   public UserBean() {
      user = new User();
   }

   @Override
   @PostConstruct
   public void createLazyDataModel() {
      setLazyModel(new LazyUserDataModel(userController));
   }

   @Override
   @PrePassivate
   public void ejbPassivate(){
      context = null;
   }

   @Override
   @PostActivate
   public void ejbActivate() {
   }

   @Override
   public String create() {
      this.conversation.begin();
      return "create";
   }


   @Override
   public String edit()
   {
      System.out.println("editing user");
      return "create";
   }

}

<h:form>
....
<p:dataTable id="userTable" var="usr" value="#{userBean.lazyModel}"
            paginator="true"
            paginatorTemplate="{FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
            rowsPerPageTemplate="5,10,15" paginatorPosition="bottom" rows="10"
            currentPageReportTemplate="{currentPage} de {totalPages}">
            <p:column headerText="Username">
               <h:outputText value="#{usr.name}" />
            </p:column>
            <p:column>
               <p:commandLink value="Edit" action="#{userBean.edit}" actionListener="#{userBean.update}" update="userTable" />
            </p:column>

         </p:dataTable>
</h:form>

有人可以帮忙吗?

由于

凯利

2 个答案:

答案 0 :(得分:3)

嗯,肯定应该工作。你的代码没有明显的错误,但是我怀疑你提供的代码片段中有一些“尝试和错误”的历史......; - )

尝试调试会话并查看哪些会话被解决(以及何时)。您是否正确传播了会话ID?

当您编写ViewScoped作品时 - 您是否将Seam 3用于将JSF范围桥接到CDI,还是可以将JSF和CDI范围混合在一起?

并且:不要在构造函数中放置任何EJB代码,因为在调用它时(以及频率)不能保证。最好改为使用@PostConstruct

答案 1 :(得分:1)

我的问题是我没有正确传播会话ID。