从这里的任何Spring大师那里得到帮助都不太幸运。希望这次我把问题写得更好,这样更有意义。我有一个相当基本的Spring应用程序使用Mysql数据库。基本上,我只是想知道如何正确地将数据加载到表单上的SELECT对象中,但我需要整个过程。
这里有一些深度。我有一个Job对象,它存储在DB中的Job表中。它绑定到一个表单,用户可以填写该表单来填充Job对象。Job对象还与Filter对象具有多对一关系,该对象存储在DB中的单独表中。因此,当用户使用表单创建Job对象时,有一个SELECT框,其中装载了过滤器对象供用户选择。到目前为止,我所有的代码都工作得很好。过滤器对象显示,然后存储在DB正确,所以我相信我有那部分的权利。当用户试图编辑Job对象时,问题就出现了。加载表单后,来自Job对象的所有数据都被正确地预先填充到各个框中,只是SELECT框没有自动设置为Job对象存储的选项。SELECT对象正在加载过滤器对象,但它总是被设置为第一选择,而不是第四个选择或碰巧存储在Job对象中的任何选择。所以很明显,我没有做对什么,或者错过了这个过程的一些重要方面。如果有人能帮我解决这个问题,我将非常感激。这是一个错误的应用程序的工作,我试图修复,我似乎无法找到解决方案。无论如何,下面我已经张贴了我认为所有相关的代码。
<<p> 工作对象/strong>@Entity
public class Job implements Runnable {
@Id @GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name="filterId")
private Filter filter;
//getters and setters
}
过滤器编辑器(用于将表单传递的id转换为过滤器对象)
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>
如果我可以澄清任何事情或提供任何其他请让我知道。我一直试图解决这个问题的天,我在一个损失。再次感谢。
在黑暗中拍摄,因为我不是Spring MVC专家,不知道你是否在使用Open Session in View。
如果您不使用Open Session In View,并且如果Spring使用equals
将选定的过滤器与选择框中的每个过滤器进行比较,那么问题可能来自filter实体中缺乏对equals(和hashCode)的适当重新定义。实际上,您将有两个不同的Filter实例,它们具有相同的ID,但对于equals
来说是不同的。
请检查id
字段的值,这是您设置为select…id字段必须解析为列表中的值,否则您将开始得到像您解释的那样的结果。
需要实现hashCode()和equals()方法,以便在下拉框中查看正确的项…我试过了!!