没有太多运气从你们这里的任何一个春天大师那里得到帮助。希望这次我能更好地提出问题所以更有意义。我有一个使用Mysql数据库的相当基本的Spring应用程序。基本上我只是想知道将数据加载到表单上的SELECT对象的正确方法,但我需要整个过程。
这里有点深入。我有一个Job对象存储在DB的Job表中。它与用户可以填写以填充Job对象的表单相关联。 Job对象还与Filter对象具有Many to One关系,该对象存储在DB的单独表中。因此,当用户使用表单创建Job对象时,会有一个SELECT框,其中加载了Filter对象供他们选择。到目前为止,我所有的代码都可以正常工作。显示过滤器对象,然后正确地存储在数据库中,所以我相信我有正确的部分。当用户尝试编辑Job对象时出现问题。我加载表单,并将Job对象中的所有数据正确预先填充到各个框中,但SELECT框不会自动设置为Job对象存储选项。 SELECT对象正在加载Filter对象,但它始终设置为第一个选择,而不是说第4个或任何碰巧存储在Job对象中的对象。很明显,我没有做正确的事情或遗漏了这个过程的一些重要方面。如果有人能帮助我,我会非常感激。这是我正在尝试解决的工作应用程序中的错误,我似乎无法找到解决方案。无论如何,下面我发布了我认为是所有相关代码的内容。
工作对象
@Entity
public class Job implements Runnable {
@Id @GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name="filterId")
private Filter filter;
//getters and setters
}
过滤器编辑器(用于将从表单传递的id转换为Filter对象)
public class FilterEditor extends PropertyEditorSupport {
private FilterService filterService;
public FilterEditor(FilterService filterService) {
this.filterService = filterService;
}
public void setAsText(String value) {
long filterId = Long.parseLong(value);
Filter f = filterService.getById(provisionId);
setValue(f);
}
}
职位总监(相关部分)
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Date.class, new DatePropertyEditor());
binder.registerCustomEditor(Filter.class, new FilterEditor(filterService));
}
@RequestMapping(value="/job", method=RequestMethod.GET)
public void showJobForm(Model model) {
model.addAttribute(new Job());
model.addAttribute("filters", filterService.getAll());
}
@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", filterService.getAll());
return "job";
}
和JSP的相关部分
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<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>
</td></tr>
</table>
</sf:form>
如果我可以澄清任何内容或提供其他任何内容,请告诉我。我一直试图解决这个问题几天,我不知所措。再次感谢。
答案 0 :(得分:1)
请检查id
字段的值,这是您设置的选项值... id字段必须解析为包含列表的值,否则您将开始得到像你解释过的结果......
答案 1 :(得分:1)
在黑暗中拍摄,因为我不是Spring MVC的专家,也不知道你是否在使用Open Session In View。
如果您没有在视图中使用Open Session,并且Spring使用equals
将所选过滤器与选择框中的每个过滤器进行比较,那么问题可能来自缺乏对equals的正确重新定义(和Filter实体中的hashCode)。实际上,您将拥有两个不同的Filter实例,具有相同的ID,但在equals
方面有所不同。
答案 2 :(得分:0)
需要实现hashCode()和equals()方法才能在下拉框中查看正确的项目...我试过了!!!