2

PrimeFaces 3.3 dataTable に並べ替えを追加したいと考え、リストを格納する次の ViewScoped Bean を作成したため、EJB から常にフェッチされることはありません。

@Named
@ViewScoped
public class CustomerList implements Serializable {

    private static final long serialVersionUID = 6168621124401208753L;

    @EJB 
    CustomerEJB customerBean;

    List<Customer> allCustomers = null;

    public void loadCustomerList() {
        allCustomers = customerBean.findAll();
    }

    public List<Customer> getList() {
        if (allCustomers == null) {
            loadCustomerList();
        }
        return allCustomers;
    }

}

これは、Bean を使用したビューです。

<ui:composition template="/WEB-INF/templates/template.xhtml">

  <ui:define name="content">

        <h:form id="customerList">

          <p:dataTable id="customer" var="customer"
            value="#{customerList.list}" sortBy="#{customer.id}"
            paginator="true" rows="10" paginatorAlwaysVisible="false"
            paginatorPosition="top">
            <p:column sortBy="#{customer.id}">
              <f:facet name="header">
                <h:outputText value="#{msg.customerIdLabel}" />
              </f:facet>
              <h:outputText value="#{customer.id}" />
            </p:column>
            <p:column sortBy="#{customer.lastName}">
              <f:facet name="header">
                <h:outputText value="#{msg.customerLastNameLabel}" />
              </f:facet>
              <h:outputText value="#{customer.lastName}" />
            </p:column>

問題は、並べ替えのために列ヘッダーをクリックできることですが、最初の並べ替えが機能していなくても、テーブルは並べ替えられないままです。getList() メソッドにブレークポイントを設定すると、リクエストの処理中にリストが EJB から数回フェッチされることがわかります。ビューが ViewScope によってアクティブである限り、Bean を保存する必要はありませんか?

4

3 に答える 3

2

まず第一に、あなたの問題とは直接関係ありませんが、ビジネスメソッドをコンポーネントゲッターに配置しないでください(そのnullチェックがあっても、これは悪い習慣だと思います)。代わりに @PostConstruct アノテーションを使用します。

@PostConstruct
public void loadCustomerList() {
    allCustomers = customerBean.findAll();
}

public List<Customer> getList() {
    return allCustomers;
}

ViewScoped Bean が構築されるたびに、loadCustomerList が呼び出されます。また、スコープ アノテーションのインポートを確認します。

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

最後に、クラスは次のようになります。

@ViewScoped
@ManagedBean
public class CustomerList implements Serializable {
    ...
}
于 2012-09-02T05:54:47.057 に答える
1

@ViewScopedは CDI ではサポートされていないため@ViewScoped、CDI で使用する必要がある場合は、

  • seam-facesまたはMyFaces CODIモジュールを使用します。それらの 1 つをクラスパスに追加するだけで@ViewScoped、CDI で動作します。MyFaces CODI は @ViewScoped をさらに強力にサポートしています
  • MyFaces CODI を使用します@ViewAccessScoped。これは、Apache によって CDI の上に記述された拡張機能です。ダウンロード@ViewAccessScopedして、 の代わりに注釈を使用して@ViewScopedください。
  • CDI@ConversationScopedを使用して長時間実行します。詳しくはこちらをご覧ください

残念ながら、seam3 ソリューションにはメモリ リークの問題があるため、この特別な問題には seam3 を使用しないでください。より良い解決策は CODI@ViewAccessScopedです。

参照: ViewScoped Bean でメモリ リーク?

于 2012-09-01T18:48:40.903 に答える
0

このアノテーション Bean の組み合わせを使用する必要があります。

@ManagedBean の場合、@ViewScoped を使用する必要があります

@Named (CDI) の場合、@ConversationScoped を使用する必要があります

于 2016-07-27T08:49:35.493 に答える