したがって、おそらくかなり古いスタイルのSpringプロパティ変換を使用しています。基本的に、ページが読み込まれると、エンティティオブジェクトがID値に変換され、ページが送信されると、id値が取得され、そのIDでエンティティオブジェクトが検索され、データが返されます。
例を以下に示します。
import org.springframework.binding.convert.converters.StringToObject;
public class StringToExamVO extends StringToObject {
private VerifyService verifyService;
public StringToExamVO(VerifyService verifyService) {
super(ExamVO.class);
this.verifyService = verifyService;
}
@Override
public String toString(Object object) {
ExamVO spec = (ExamVO) object;
return (spec != null && spec.getId() != null ? spec.getId().toString() : null);
}
@Override
public Object toObject(String string, Class targetClass) {
if (string != null && string.length() > 0 && targetClass.equals(ExamVO.class)) {
String id = StringUtils.trimToNull(string);
return verifyService.loadExam(Integer.decode(id));
}
return null;
}
}
これは、フォームバッキングコマンドに単一のエンティティプロパティがある場合にうまく機能します。
private ExamVO exam;
public void setExam(ExamVO exam) {
this.exam = exam;
}
public ExamVO getExam() {
return this.exam;
}
ただし、プロパティがエンティティのリストである場合は機能しないようです。
private List<ExamVO> exams;
public void setExams(List<ExamVO>exam) {
this.exams = exams;
}
public List<ExamVO> getExams() {
return this.exams;
}
単一のプロパティタイプのデバッガーをたどると(最初の例)、ページの読み込みと送信時にそれぞれtoStringとtoObjectの両方が呼び出されることがわかります。
ただし、プロパティがLISTの場合のデバッグでは、toStringのみが呼び出されます(繰り返しそのリストをcosします)。ページ送信では、toObjectの呼び出しはありません。つまり、文字列IDをエンティティオブジェクトに変換しようとさえしていません。
リストプロパティゲッターにブレークポイントを設定すると、リストはインデックススロットにあったオブジェクトgetExams
として定義されていますが、 !で上書きされていることがわかります。List<ExamVO>
ExamVO
Strings
Spring変換フレームワークは、その値を設定しているため、スロットごとList<ExamVO>
にコンバーターのtoObjectメソッドを呼び出す必要があることを検出できませんか?StringToExamVO