我在 Spring MVC 中使用自定义编辑器将字符串值映射到我的域对象。简单案例:用户对象指的是公司(User.company -> Company)。在用户表单中,我注册了数据绑定器:
protected void initBinder(WebDataBinder binder) throws Exception {
binder.registerCustomEditor(Company.class, new CompanyEditor(appService));
}
编辑器定义如下:
class CompanyEditor extends PropertyEditorSupport {
private AppService appService;
public CompanyEditor(AppService appService) {
this.appService = appService;
}
public void setAsText(String text) {
Company company = appService.getCompany(text);
setValue(company);
}
public String getAsText() {
Company company = (Company) this.getValue();
if (company != null)
return company.getId();
return null;
}
}
当我在表单中使用下拉菜单时
<form:select path="company">
<form:options items="${companies}" itemLabel="name" itemValue="id"/>
</form:select>
我遇到了严重的性能问题,因为(我想检查是否选择了公司)为每个选项触发 setAsText 和 getAsText,这使得它为每个公司运行 SQL 查询。
我认为当我提交表单时使用 setAsText 以使应用程序知道如何将公司 ID 转换为公司(持久)对象。为什么要在下拉菜单中触发它。任何想法如何解决它?