2

あるページから、各ページが異なるビューにある別のページにオブジェクトを渡そうとしています。

最初のページには、入力テキストがあります。ここで、myBean は ViewScoped Bean であり、name はオブジェクトです。 <h:inputText value="#{myBean.name}"/>

2ページ目には、
<f:metadata>
<f:viewParam name="userId" value="#{myBean.name}"/>
</f:metadata>

「null コンバーター」のエラー Conversion Error setting value mypackage.myBean@257100b が表示されます。ビュー パラメータに String 値以外のオブジェクトを渡すことはできますか?

4

1 に答える 1

11

はい、できます。#{myBean.name}背後にあるオブジェクト型の文字列表現と実際のオブジェクトとの間で変換するコンバーターを提供するだけです。通常、文字列表現は、問題のオブジェクトの固有の技術的/自然な識別子です。たとえば、テーブルの PK です。HTTP 要求パラメーターは文字列のみである可能性があるため、文字列でなければなりません。URL で複雑な Java オブジェクトを渡すことはできません。URL は単なる文字列です。

キックオフの例を次に示します。

たとえば、初期ビューで次のようにします。

<h:link value="Edit" outcome="edit">
    <f:param name="id" value="#{personViewer.person.id}" />
</h:link>

(これにより が生成されます<a href="edit.xhtml?id=123">Edit</a>)

リンクされたビューでは次のようになります。

<f:metadata>
    <f:viewParam name="id" value="#{personEditor.person}"
        converter="#{personConverter}" converterMessage="Bad request. Unknown person."
        required="true" requiredMessage="Bad request. Please use a link from within the system."
    />
</f:metadata>
<h:messages />

このコンバーターで

@ManagedBean
@RequestScoped
public class PersonConverter implements Converter {

    @EJB
    private PersonService personService;

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return String.valueOf(((Person) value).getId());
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return personService.find(Long.valueOf(value));
    }

}

(単純化しすぎています。すべての null/number チェックが省略されていますが、アイデアはわかりました)

以下も参照してください。


コメントに従って更新します。実際には POST リクエストを発行したいと考えています。はまったく必要ありません<f:viewParam>。GET リクエスト パラメータの設定/検証/変換専用です。オブジェクト全体をシリアライズしようとしてもまったく意味がありません。を使用するだけ@ManagedPropertyです。

例えば

@ManagedBean
@ViewScoped
public class PersonEditor implements Serializable {

    @ManagedProperty("#{personViewer.person}")
    private Person person;

    // ...
}

ブックマークできなくなっただけで、SEO フレンドリーではありません (ただし、これは POST の性質であり、おそらくすでに長い間認識されています)。#{personViewer}Bean 自体も である必要がある@ViewScoped(したがって ではない)ことに注意してください@ReqestScoped。また、リダイレクトで戻るのではなく、進むだけであることを確認する必要があります。

于 2011-12-22T20:44:48.373 に答える