1

私は次のファセットテンプレートを持っています:

<f:metadata>
    <o:viewParam name="id" value="#{homeBean.id}" />
</f:metadata>                

<h:form>
    <h:inputHidden value="#{homeBean.id}" />
    <h:inputText value="#{homeBean.user.firstName}" />
    <h:commandButton value="Submit" action="#{homeBean.onSave()}" />
</h:form>

およびリクエストスコープのBean:

@Named
@RequestScoped
public class HomeBean {
    private Integer id;
    private User user;

    public void setId(Integer id) {
      System.out.println("setId called");
      user = // code for loading User entity bean with supplied id
    }

    // other accessors for id and user
}

最初のページの読み込みは適切に機能し、エンティティが読み込まれてフォームに表示され、inputHiddenがエンティティIDに設定されます。問題は、送信スローです。

javax.el.PropertyNotFoundException - Target unreachable, base expression '. user' resolved to null

おそらく、getUserがsetIdの前に呼び出されたためです。どうすればこれを解決できますか?私は本当にリクエストスコープのBeanが欲しいのですが、これは少なくともviewaccessスコープのBeanで簡単に解決できることを知っています。

編集:プロセス検証フェーズで例外がスローされることに気づきました。最初は、モデル値の更新フェーズで例外がスローされると思いました。「privateUser」を「privateUseruser= new User()」に変更しましたが、今は大丈夫ですが、少し変な感じがします。

よろしく、パベル

4

1 に答える 1

1

OmniFaces<o:viewParam>は、最初のリクエストでのみリクエストパラメータを設定し、ポストバックでは設定しません。これは@ViewScoped、リクエストパラメータがすべてのポストバックで不必要に検証、変換、更新されないように、Beanで使用することを目的としています(ビュースコープのBeanにすでに存在しているため)。APIドキュメントとショーケースの例は、ビュースコープのBeanで使用する必要があることも明示的に示されています。

ただし、リクエストスコープのBeanがあり、リクエストごとに、また同じビューへのポストバックでも、ゴミ箱に入れられて再作成されます。そのため、プロパティは表示されなくなり、後続のポストバックリクエストごとuserにデフォルトにフォールバックします。null

これを修正するには、基本的に2つの方法があります。

  1. <o:viewParam>に置き換え<f:viewParam>ます。リクエストごとに、またポストバックでもセッターを呼び出します。

  2. に置き換えます。これ@Named @RequestScopedにより@ManagedBean @ViewScoped、同じビューを操作している限り、Beanは存続します。または、CDIの使用を主張する場合は、@Named @ConversationScoped代わりに使用しますが、会話の開始と終了を自分で管理する必要があります。

于 2012-06-28T12:52:22.017 に答える