Java SpringMVC绑定问题
在我的SpringMVC应用程序中,我有用户可以创建的级别。对于这些级别,级别需要满足各种要求(需要汽车、电话等) 创建新级别时,用户可以看到所有这些需求的列表,并将这些需求移动到“必需的需求”区域(通过单击它们将它们从一个div来回移动到另一个div)。它看起来有点像这个jspJava SpringMVC绑定问题,java,spring,spring-mvc,Java,Spring,Spring Mvc,在我的SpringMVC应用程序中,我有用户可以创建的级别。对于这些级别,级别需要满足各种要求(需要汽车、电话等) 创建新级别时,用户可以看到所有这些需求的列表,并将这些需求移动到“必需的需求”区域(通过单击它们将它们从一个div来回移动到另一个div)。它看起来有点像这个jsp <div id="allRequirements"> <c:forEach var="requirement" items="${RequirementList}">
<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>
控制器中此添加功能的方法如下所示
@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中插入
,然后执行类似操作
String[] requiredRequirements = ((String) result.getFieldValue("requirements")).split(",");
level.setRequirements(getRequirementsFromIDs(requiredRequirements));
在我调用validate方法之前,这一切都很好,因为在绑定结果中,需求只是一个字符串列表(来自名为requirements的隐藏字段),因此它会引发类型不匹配。我曾想过写一个属性编辑器,但这似乎是一个解决问题的技巧
我想知道是否有人对如何解决这个问题有任何建议
提前感谢您为这种情况编写一个Property编辑器(或更好的Spring 3转换器),这不是一个黑客行为。这就是属性编辑器的用途。因此,这只是黑客的解决方案,而不是黑客的解决方案
但是有一个更好的方法来处理列表问题。因为Spring 3转换器用于单个对象,如(
字符串
(id)到需求
)可以通过Spring自动应用于需求
的列表。因此,您只需要编写一个转换器,该转换器可以将id的字符串
表示形式转换为要求
。Spring也会将此应用于列表。属性编辑器是如何做到这一点的,为什么您认为这是一种黑客行为?您尝试过Spring:bind吗@因为这似乎是对我的情况的一种攻击,需求对象的内容必须来自某个地方。您可以告诉spring如何将一个需求ID转换为一个完整的需求(PropertyEdit),或者将需求的全部内容放到POST中。因此,我需要做的就是编写一个转换器,将ID的字符串表示形式转换为一个需求。然后春天会为我做剩下的事。那么,它会将字符串列表转换为需求列表吗?您需要注册它们。-是的,Spring也将把它应用到列表中。
String[] requiredRequirements = ((String) result.getFieldValue("requirements")).split(",");
level.setRequirements(getRequirementsFromIDs(requiredRequirements));