JSFマネージドBeanゲッターは絶対にサービスを呼び出さないでください。管理対象のBeanプロパティを返すだけです。このプロパティは、(ポスト)コンストラクターまたは(アクション)リスナーメソッドによって既に準備されている必要があります。これらのメソッドは1回だけ呼び出されます。JSFが値にアクセスする必要があるため、ゲッターは複数回呼び出されます。
初めてのジョブがマネージドBeanの(ポスト)コンストラクターで実行され<a4j:poll>
、リストを更新するリスナーメソッドが呼び出され、ゲッターがプロパティを返す以外に何もしないように、コードを書き直す必要があります。 。
これは、標準のJavaEE6アーティファクトを使用した基本的なキックオフの例です。私はSpringをしませんが、Springアーティファクトでこれを置き換えることができるはずです。
@ManagedBean
@SessionScoped
public class Bean {
private List<Entity> entities;
@EJB
private EntityService service;
@PostConstruct
public void load() {
entities = service.list();
}
public List<Entity> getEntities() {
return entities;
}
}
と
<a4j:poll action="#{bean.load}" interval="60000" render="someTableId" />
参照:
具体的な問題とは関係ありません。かなり大きなDBテーブル(> 1000行)がある場合、DBテーブル全体をJavaのメモリにコピーすることはかなり悪い考えです。ページ付け/フィルタリングを実装します。