DTOのライフサイクルとプロパティの保存
DTOのライフサイクルをrequestにする場合、プロパティはフォーム部品にバインディングして保持することになりますが、List型のプロパティを保存できないのが悩ましいです。
public class EditEmployeeDto implements Serializable {
private String name;
private Long sectionId;
private List<Section> selectableSections; // 部門の選択肢
// 以下getter, setter
}
...
名前: <input type="text" m:value="#{editEmployeeDto.name}" m:required="true"/>
部門: <select m:value="#{editEmployeeDto.sectionId}"
m:items="#{editEmployeeDto.selectableSections}"
m:itemLabel="name" m:itemValue="id"/>
...例えばこのようなDTOとHTMLの組み合わせがあり、DTOがrequest属性だとします。「名前」を未入力にしてsubmitすると、バリデーションエラーが発生して同じ画面に戻ってきますが、このとき「部門」の選択肢が消えてしまいます。
1画面で完結する操作に対してはrequest属性のDTOを割り当てるのが基本だと思いますが、このようにList型プロパティを含むDTOの場合、バリデーションまで考慮するとsessionを使わざるを得なくなります。Listをhiddenフィールドにシリアライズできれば便利だなと思います。