2011-12-02 69 views
0

使用Spring 3.1。我有一个填充存储在数据库中的POJO的表单。然而,这也POJO中有一个又一个POJO的例子:弹簧窗体未加载用正确的数据选择

class Job { 
    private id; 
    private Filter filter; 
    //getters and setters 
} 

和过滤器类:

class Filter { 
    private id; 
    private name; 
    //getters and setters 
} 

使填充工作对象,我试图显示过滤器的形式选择对象中的对象。所有这一部分似乎都能正常工作。当我尝试编辑已有Filter的Job对象时,问题就出现了。选择对象不会自动将其自身设置为与作业关联的相应Filter对象。想知道如果有人能让我知道我搞砸了什么。下面是JSP:

<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%> 
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%> 

<div align="center"> 
<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> 
      <button dojoType="dijit.form.Button" id="testButton">Test</button> 
     </td></tr> 
    </table> 
</sf:form> 
</div> 

这里是控制器(或者至少相关部分):

@Controller 
public class JobController { 
@Autowired 
private JobService jobService; 
@Autowired 
private ProvisionService provisionService; 

@InitBinder 
protected void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(Date.class, new DatePropertyEditor()); 
    binder.registerCustomEditor(Provision.class, new ProvisionEditor(provisionService)); 
} 

@ModelAttribute("filters") 
@RequestMapping(value="/job", method=RequestMethod.GET) 
public List<Provision> showJobForm(Model model) { 
    model.addAttribute(new Job()); 

    return provisionService.getAll(); 
} 

@RequestMapping(value="/job", method=RequestMethod.POST) 
public String submitJobForm(@Valid Job job, BindingResult bindingResult) { 
    if(bindingResult.hasErrors()) 
     return "job"; 

    job.setStatus("Running"); 
    JobManager.AddJob(job); 

    jobService.save(job); 

    return "redirect:/"; 
} 

@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", provisionService.getAll()); 
    return "job"; 
} 
} 

,需要从选择的ID转换条文规定的ProvisionEditor:

public class ProvisionEditor extends PropertyEditorSupport { 

private ProvisionService provisionService; 

public ProvisionEditor(ProvisionService provisionService) { 
    this.provisionService = provisionService; 
} 

public void setAsText(String value) { 
    long provisionId = Long.parseLong(value); 
    Provision p = provisionService.getById(provisionId); 
    setValue(p); 
} 
} 

所以,正如我所说,创建新的作业时,事情工作正常。条款列表被加载到select中,所有内容都被正确分配并正确存储在数据库中。但是,当用户稍后选择提供并进行编辑时,它会将它们带到相同的表单中,并且所有数据均正确加载,但Provision选择除外。它载入条款列表,但不会选择正确的条目。任何想法如何解决这个问题?谢谢。

回答

0

原来的问题是我没有覆盖对象的Equals和Hashcode。解决了另一个问题后,我遇到了问题,修复了问题,并且所有事情都按照原样开始工作。由于我使用了Eclipse,所以变得特别容易,并且它自动生成覆盖这两种方法。

0

试试这个代码jsp页面

<form:select path=""> 
    <c:forEach items="" var=""> 
    <option value=""><c:out value="" /></option> 
    </c:forEach> 
</form:select> 

这应该为你工作。

+0

虽然这是从列表对象中填充选择框的替代方法,但它实际上并未解决我的问题。基于加载到表单中的对象,选择框不会自动设置为正确的选项。另外,我在jsp中使用的解决方案更加清晰,因此我不确定为什么我会使用解决方案,除非它实际解决了我遇到的问题。不过谢谢。 – cardician