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

标签 java javascript html spring spring-mvc

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

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

作业对象

@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);
}
}

作业 Controller (相关部分)

@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 。

如果您没有使用“在 View 中打开 session ”,并且 Spring 使用 equals 将所选过滤器与选择框中的每个过滤器进行比较,那么问题可能来自于缺乏正确的重新定义Filter 实体中的 equals(和 hashCode)。事实上,您将拥有两个不同的 Filter 实例,它们具有相同的 ID,但在 equals 方面有所不同。

关于java - 不确定使用 Spring 加载 SELECT 对象的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8432879/

相关文章:

html - 包含 float 而不切断特定元素

html - 用于创建数学方程式的编辑器

java - 迭代 Set.toArray() 返回的数组是否线程安全

java - 从 java 调用已经生成的 C 代码

java - 如何正确导入stddraw?

javascript - 找不到更改行颜色的方法

javascript - 如何在一个 div 中垂直滚动并同时影响水平滚动的另一个 div

jquery - 在父 td 之外扩展 textarea

java - 在适配器中返回相同的 fragment

javascript - 获取 JSON 中的最后一个索引值