不确定使用Spring加载SELECT对象的正确方法



从这里的任何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()方法,以便在下拉框中查看正确的项…我试过了!!