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フィールドにシリアライズできれば便利だなと思います。