SpringMVC自定义集合编辑器不将数据返回到Jsp


问题内容

我在spring绑定了一个多选择列表,该项目无法从DAO获取其数据,而数据是从另一个选择选项列表中添加的。用户单击一个按钮,然后使用jquery将数据发送到多选选项列表。

发布表单时,由于该项目的数据类型复杂,因此不会进行数据绑定,因此我注册了CustomEditor并将其附加到@initbinder。

编辑 我已经更新了代码, CollectionEditor
现在将公民列表返回到视图,但是我无法获取列表中的数据来填充选择选项。我试图将元素添加到列表中,但是从服务器返回时,jsp仍然选择保持null。

下面是代码:

CustomCollectionEditor

@InitBinder("crime")    
    protected void initBinder(WebDataBinder binder, HttpServletRequest request, ServletRequestDataBinder victimbinder){
     victimbinder.registerCustomEditor(List.class, "victims", new CustomCollectionEditor(List.class){
         protected Object convertElement(Object element){

             Citizens victims = new Citizens();

             String ssNumber = "";

             if (element instanceof String){
                ssNumber = (String) element;

             }

             logger.debug("element is ;" +element);

             try {

                int socialSecurityNumber = Integer.parseInt(ssNumber);
                victims = citizenManager.getCitizen(socialSecurityNumber);

            } catch (NumberFormatException e) {                     
                logger.error(e.getMessage());
            } catch (Exception e) {
                logger.error(e.getMessage());
            }

             return victims;        
         }

    });

从控制器中的DAO填充的Jsp

当单击按钮时,它包含从DAO类填充的数据,它将数据从列表中获取,并将其追加到绑定到POJO的其他列表中

<label>Victims List</label><buttonid="addVictimBtn">/button>
<form:select path="" id="dbvictims" title="Victims Of Crime" class="victimLst">
<form:options items="${dbvictims.dbvictimList}" itemValue="socialSecurityNumber" itemLabel="name"/>
</form:select>

Jsp选择绑定到POJO的项目

<label>Victims In Crime</label><button id="removeVictimBtn">-</button> 
<form:select path="victims" id="victims" title="Victims Of Crime"  multiple="multiple" class="victimLst">
<form:options items="${victimList}" itemValue="socialSecurityNumber" itemLabel="name"/>
</form:select><form:errors path="victims" class="errors" />

问题答案:

解决此问题的方法非常简单,所有工作已在 CustomCollectionEditor中
完成。当绑定诸如上述的复杂数据类型时,这一点很重要。可能还有其他方法可以做到这一点,但是我发现这是一种非常干净和简单的方法。

return语句非常重要,因为它绑定到视图中元素的item属性。 CustomCollectionEditor 返回对象列表( 受害者 )使用
DAO 从数据库中获取对象。这很重要,因为该帖子仅发送选择值,而不发送标签,因此我们重建列表并重新发送到视图。

我省略的部分是将List Object从控制器传递回视图。

控制者

@RequestMapping(value="save.htm", method = RequestMethod.POST)
    public ModelAndView handleSave(@Valid @ModelAttribute Crime crime, 
    BindingResult result,
    ModelMap m,
    Model model) throws Exception {


    if(result.hasErrors()){
           model.addAttribute("victimList",crime.getVictims());

    return new ModelAndView("*Your View*");
...............