Java 不确定使用弹簧加载选择对象的正确方式

Java 不确定使用弹簧加载选择对象的正确方式,java,javascript,html,spring,spring-mvc,Java,Javascript,Html,Spring,Spring Mvc,没有太多的运气从你们这里的春季大师那里得到帮助。希望这次我能更好地回答这个问题,这样才更有意义。我有一个使用Mysql数据库的相当基本的Spring应用程序。基本上,我只是想知道将数据加载到表单上的SELECT对象中的正确方法,但我需要整个过程 这里有一点更深入。我有一个作业对象,它存储在数据库中的作业表中。它绑定到一个表单,用户可以填写该表单来填充作业对象。作业对象还与存储在数据库中单独表中的筛选器对象具有多对一关系。因此,当用户使用表单创建作业对象时,会有一个选择框,其中加载了供用户选择的过

没有太多的运气从你们这里的春季大师那里得到帮助。希望这次我能更好地回答这个问题,这样才更有意义。我有一个使用Mysql数据库的相当基本的Spring应用程序。基本上,我只是想知道将数据加载到表单上的SELECT对象中的正确方法,但我需要整个过程

这里有一点更深入。我有一个作业对象,它存储在数据库中的作业表中。它绑定到一个表单,用户可以填写该表单来填充作业对象。作业对象还与存储在数据库中单独表中的筛选器对象具有多对一关系。因此,当用户使用表单创建作业对象时,会有一个选择框,其中加载了供用户选择的过滤器对象。到目前为止,我所有的代码都可以很好地实现这一点。过滤器对象被显示,然后被正确地存储在数据库中,所以我相信我已经正确地找到了那个部分。当用户试图编辑作业对象时,就会出现问题。我加载表单,来自作业对象的所有数据都正确地预填充到各个框中,但选择框不会自动设置为作业对象存储选项。SELECT对象正在加载过滤器对象,但它始终设置为第一个选项,而不是第四个选项或任何存储在作业对象中的选项。所以很明显,我没有做正确的事情,也没有遗漏这个过程中的一些重要方面。如果有人能帮我,我会非常感激。这是我试图修复的工作应用程序中的一个bug,我似乎找不到解决方案。无论如何,下面我已经发布了我认为所有相关的代码

作业对象

@Entity
public class Job implements Runnable {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name="filterId")
    private Filter filter;

    //getters and setters
}
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);
}
}
过滤器编辑器(用于将表单传递的id转换为过滤器对象)

作业控制器(相关部件)

和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>

如果(!this.validate()){
返回false;
}
返回true;
客户:

项目:
日期:
过滤器: 提交

如果我能澄清任何事情或提供任何其他信息,请务必让我知道。几天来我一直在努力解决这个问题,但我不知所措。再次感谢。

请检查
id
字段的值,这是您要设置为选择的值。。。id字段必须解析为列表中的一个值,否则,您将开始得到与您所解释的一样的结果。

在黑暗中拍摄,因为我不是Spring MVC的专家,不知道您是否在视图中使用Open Session


如果您没有在视图中使用Open Session,并且如果Spring使用
equals
将所选筛选器与选择框中的每个筛选器进行比较,那么问题可能来自筛选器实体中缺少对equals(和hashCode)的正确重新定义。实际上,您将有两个不同的筛选器实例,它们具有相同的ID,但在
equals

方面有所不同。要实现hashCode()和equals()方法,需要才能在下拉框中查看正确的项。。。我试过了

我想正是这样!我实际上并没有重写equals或hashcode,这实际上是另一个错误给我带来的麻烦。非常感谢你的帮助。有时候,需要一个有着外部视角的人来澄清问题。你的答案也是正确的,非常感谢!我恐怕我标记了另一个,因为它是第一个,并且更清楚地说明了需要重写equals和hashcode。
<%@ 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>