Spring MVC绑定问题

时间:2011-11-22 22:51:15

标签: java spring spring-mvc

在我的spring mvc应用程序中,我有用户可以创建的级别。有了这些级别,有一个级别需要的各种要求(需要汽车,电话等)。

创建新级别时,用户可以看到所有这些要求的列表,并将这些要求移动到所需的要求区域(通过单击它们将它们从一个div移动到另一个div)。它看起来有点像这个jsp

<div id="allRequirements">
    <c:forEach var="requirement" items="${RequirementList}">
         <div class="requirements">
             <input type="hidden" value="${requirement.id}" name="id"/>
             <h2><c:out value="${requirement.name}"/></h2>
         </div>
    </c:foreach>
</div>
<div id="requiredRequirements"></div>

RequirementList只是一个返回需求列表的模型属性

级别和要求的模型如下所示:

public class Level {
    private String name;
    private int id;
    private int points
    private List<Requirement> requirements;
    ....
}

public class Requirement{
    private String name;
    private String id;
    ....
}

并且控制器中此添加功能的方法如下所示

@RequestMapping(value = "/level/addNewLevel", method = RequestMethod.POST)
public String addNewLevel(@ModelAttribute("level") Level level, BindingResult result, Model model)
{
    validator.validate(level, result);
    if(result.hasErrors()) {
        //show errors
    }
    else {
        //add level
    }
}

现在谈谈我的问题:

我可以得到关卡的名称,分数,ID等等,但要求根本没有过来。当提交表单时,我尝试在requiredRequirements中的div中插入<input type='hidden' value='' + id +'' name="requirements"/>并执行类似的操作

String[] requiredRequirements = ((String) result.getFieldValue("requirements")).split(",");
level.setRequirements(getRequirementsFromIDs(requiredRequirements));

这可以正常工作,直到我调用validate方法,因为在绑定结果中,需求只是一个字符串列表(来自名为requirements的隐藏字段),因此它会引发类型不匹配。我想过写一个属性编辑器,但这似乎是修复黑客的黑客攻击。

我想知道是否有人就如何解决这个问题提出任何建议。

提前致谢

1 个答案:

答案 0 :(得分:2)

为这种情况编写一个编辑器(或者更好的Spring 3 Converter)并不是一个黑客攻击。这就是房产编辑的目的。 所以它只是黑客攻击的解决方案,而不是hack的黑客攻击。

但是有一个更好的方法处理列表问题。因为(String(id)到Requirement)这样的单个对象的Spring 3 Converter可以通过spring自动应用于Requirement的List。因此,您只需要编写一个可以将id的String表示转换为Requirement的转换器。 Spring也会将此应用于列表。