所以我们使用的可能是相当老的 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(重复地因为它是一个列表)。在页面提交时,没有调用 toObject,这意味着我猜它甚至没有尝试将字符串 id 转换回实体对象。
在列表属性 getter 中放置一个断点getExams
我什至可以看到,尽管列表被定义为在其索引槽中List<ExamVO>
的ExamVO
对象被覆盖Strings
!
Spring 转换框架是否无法检测到,因为它填充了一个then 它可能应该为每个插槽List<ExamVO>
调用转换器的 toObject 方法?StringToExamVO