はい、できます。#{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
。また、リダイレクトで戻るのではなく、進むだけであることを確認する必要があります。