gpt4 book ai didi

java - Spring StringToObject.toObject() 未在列表中调用?

转载 作者:行者123 更新时间:2023-12-01 04:50:02 25 4
gpt4 key购买 nike

所以我们使用的可能是相当旧的 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 转换回实体对象。

getExams中放置断点列表属性 getter 我什至可以看到,虽然列表定义为 List<ExamVO> ExamVO其索引槽中的对象将被 Strings 覆盖!

Spring 转换框架是否无法检测到它,因为它填充了 List<ExamVO>那么它可能应该调用 StringToExamVO 的 toObject 方法每个插槽的转换器??

最佳答案

再考虑一下我在底部的问题,基本上是这样的;

“Spring 是否可以检测到它填充了一个列表,即具有泛型类型的列表,因此调用转换器将 String 转换为 ExamVO 泛型类型”

我相信答案是否定的,因为通用类型在运行时被删除。因此,在运行时,列表只是一个没有类型的列表,这就是为什么 Spring 可以向其中插入字符串而不是 ExamVO,也是为什么转换服务不会被调用,因为没有通用类型,框架不知道列表假设包含 ExamVO。

我现在已经改变了我的代码的工作方式,但短暂地玩弄了以下想法;

@SuppressWarnings("unchecked")
public List<ExamVO> getExams() {
if(Exams == null) {
exams = new ArrayList() {

@Override
public ExamVO set(int index, Object element) {
// TODO if element is a String,
// call the verifyService.loadExam(Integer.decode(element));
// to get the ExamVO and set that to element
return (ExamVO)super.set(index, element);
}
};
}
return exams;
}

这在理论上是可行的,但是从命令/表单支持对象调用服务层对我来说似乎相当不确定。

关于java - Spring StringToObject.toObject() 未在列表中调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15139475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com