使用Spring 3.1。我有一个填充存储在数据库中的POJO的表单。但是,这个POJO还有一个另一个POJO的实例:
class Job {
private id;
private Filter filter;
//getters and setters
}
和Filter类:
class Filter {
private id;
private name;
//getters and setters
}
因此,在填充Job对象的表单上,我试图在select对象中显示Filter对象。所有这一部分似乎都能正常运作。当我尝试编辑已有过滤器的Job对象时,会出现此问题。 select对象不会自动将其自身设置为与作业关联的相应Filter对象。想知道是否有人可以让我知道我搞砸了什么。这是JSP:
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<div align="center">
<s:url value="/job" var="jobPost_url"/>
<s:url value="/job/provData" var="provData_url"/>
<sf:form method="POST" modelAttribute="job" dojoType="dijit.form.Form" action="${jobPost_url}">
<script type="dojo/method" event="onSubmit">
if (!this.validate()) {
return false;
}
return true;
</script>
<sf:hidden path="id" />
<table>
<tr><td align="right">Customer:</td><td>
<sf:input path="customer" dojoType="dijit.form.ValidationTextBox" trim="true" required="true"/><br/>
<sf:errors path="customer" cssClass="error"/>
</td></tr>
<tr><td align="right">Project:</td><td>
<sf:input path="project" dojoType="dijit.form.ValidationTextBox" trim="true" required="true"/><br/>
<sf:errors path="project" cssClass="error"/>
</td></tr>
<tr><td align="right">Date:</td><td>
<sf:input path="date" dojoType="dijit.form.DateTextBox" required="true"
constraints="{datePattern:'MMM d, y'}" /><br/>
<sf:errors path="date" cssClass="error"/>
</td></tr>
<tr><td align="right">Filter:</td><td><sf:select id="filter" path="filter" items="${filters}" itemValue="id"
itemLabel="programName"/></td>
</tr>
<tr><td colspan="2" align="right">
<button dojoType="dijit.form.Button" type="submit">Submit</button>
<button dojoType="dijit.form.Button" id="testButton">Test</button>
</td></tr>
</table>
</sf:form>
</div>
这是控制器(或至少是相关部分):
@Controller
public class JobController {
@Autowired
private JobService jobService;
@Autowired
private ProvisionService provisionService;
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Date.class, new DatePropertyEditor());
binder.registerCustomEditor(Provision.class, new ProvisionEditor(provisionService));
}
@ModelAttribute("filters")
@RequestMapping(value="/job", method=RequestMethod.GET)
public List<Provision> showJobForm(Model model) {
model.addAttribute(new Job());
return provisionService.getAll();
}
@RequestMapping(value="/job", method=RequestMethod.POST)
public String submitJobForm(@Valid Job job, BindingResult bindingResult) {
if(bindingResult.hasErrors())
return "job";
job.setStatus("Running");
JobManager.AddJob(job);
jobService.save(job);
return "redirect:/";
}
@RequestMapping(value="/job/edit", method=RequestMethod.POST)
public String editJob(@RequestParam("jobHiddenList") String list, Model model) {
log.info("Edit List: " + list);
Job job = jobService.getById(Long.valueOf(list.trim()));
model.addAttribute("job", job);
model.addAttribute("filters", provisionService.getAll());
return "job";
}
}
ProvisionEditor需要将Provision从select的ID转换为Provision:
public class ProvisionEditor extends PropertyEditorSupport {
private ProvisionService provisionService;
public ProvisionEditor(ProvisionService provisionService) {
this.provisionService = provisionService;
}
public void setAsText(String value) {
long provisionId = Long.parseLong(value);
Provision p = provisionService.getById(provisionId);
setValue(p);
}
}
因此,正如我所说,创建新作业时工作正常。 Provisions列表被加载到select中,所有内容都被正确分配并正确存储在DB中。但是,当用户稍后选择一个provison并对其进行编辑时,它会将它们带到相同的表单,并且除了Provision select之外,所有数据都会正确加载。它加载了条款列表,但没有选择正确的条款。我有什么想法可以解决这个问题吗?感谢。
答案 0 :(得分:0)
尝试jsp页面的代码
<form:select path="">
<c:forEach items="" var="">
<option value=""><c:out value="" /></option>
</c:forEach>
</form:select>
这应该适合你。
答案 1 :(得分:0)
原来问题是我没有覆盖对象的Equals和Hashcode。在解决了另一个问题后,我遇到了问题,修复了它,一切都开始正常工作了。它变得特别容易,因为我使用Eclipse并且它自动生成覆盖这两种方法。