S2StrutsのPOJO Form利用時の仕様について
S2StrutsでPOJO Formを利用した場合に、画面遷移のパターンによってHttpRequestに格納されるオブジェクトの型が異なるようです。
- entry.jspにフォワード→EntryInitActionでEntryFormに値を格納
- この場合、HttpRequestにはPOJO Formそのものが格納される。
- entry.jspからPOST→EntryActionでEntryFormに値を格納→entry.jspにフォワード→EntryInitActionでEntryFormに値を格納
- この場合、HttpRequestにはBeanValidatorFormに変換されたEntryFormが格納される。
この仕様に違いにより、JSTLタグでFormを扱おうとするとentryFormそのものを扱うか、entryForm.instance(BeanValidatorFormからPOJO Formを取得)を扱うかを遷移パターンによって切り替える必要が出てきてしまいます。
仕様が異なる理由は、データがPOSTされた場合はProcessPojoFormInterceptorにより、POJO FormがBeanValidatorFormに変換されますが、直接jspにフォーワードされた場合はPOJO Formそのものが扱われるためと思われます。
この仕様を統一する対応としては、現在BindingUtilのexportPropertyメソッドでHttpRequestに格納されるオブジェクトがBeanValidatorFormだった場合には、BeanValidatorFormを格納していますが、下記のようにPOJO Formそのものを返すことで対応可能なようです。現在、BeanValidatorFormを格納している理由は何でしょうか?
BindingUtil.javaファイルの変更
if (BeanValidatorFormUtil.isBeanValidatorForm(container.getRequest(), propertyName)) { BeanValidatorForm beanValidatorForm = (BeanValidatorForm) BeanValidatorFormUtil.toBeanValidatorForm( container.getRequest(), propertyName, value); value = beanValidatorForm.getInstance(); }