在我的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的隐藏字段),因此它会引发类型不匹配。我想过写一个属性编辑器,但这似乎是修复黑客的黑客攻击。
我想知道是否有人就如何解决这个问题提出任何建议。
提前致谢
答案 0 :(得分:2)
为这种情况编写一个编辑器(或者更好的Spring 3 Converter)并不是一个黑客攻击。这就是房产编辑的目的。 所以它只是黑客攻击的解决方案,而不是hack的黑客攻击。
但是有一个更好的方法处理列表问题。因为(String
(id)到Requirement
)这样的单个对象的Spring 3 Converter可以通过spring自动应用于Requirement
的List。因此,您只需要编写一个可以将id的String
表示转换为Requirement
的转换器。 Spring也会将此应用于列表。