【问题标题】:Spring MVC binding issueSpring MVC 绑定问题
【发布时间】:2011-11-22 22:51:15
【问题描述】:

在我的 spring mvc 应用程序中,我有用户可以创建的关卡。对于这些级别,需要满足各种要求(需要汽车、电话等)。

创建新关卡时,用户可以看到所有这些需求的列表,并将这些需求移动到所需的需求区域(通过单击它们将它们从一个 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 中插入 &lt;input type='hidden' value='' + id +'' name="requirements"/&gt; 并执行类似的操作

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

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

我想知道是否有人对如何解决此问题有任何建议。

提前致谢

【问题讨论】:

  • 属性编辑器是怎么做的,为什么你认为这是一个 hack?
  • 你试过spring:bind吗? mattfleming.com/node/134
  • @Affe 对于我的情况来说,这似乎是一个黑客攻击
  • 需求对象的内容必须来自某个地方。要么告诉 spring 如何将需求 ID 转换为整个需求(PropertyEditor),要么将需求的全部内容放入 POST。

标签: java spring spring-mvc


【解决方案1】:

为这种情况编写一个属性编辑器(或者更好的是 Spring 3 转换器)并不是一个 hack。这就是属性编辑器的用途。 所以它只是破解的解决方案,而不是破解的破解。

但是有一个更好的方法来处理列表问题。因为 Spring 3 Converter for single objects like (String(id) to Requirement) 可以通过 spring 自动应用于 Requirements 列表。所以你只需要编写一个转换器,它可以将 id 的String 表示形式转换为Requirement。 Spring 也会将此应用于列表。

【讨论】:

  • 所以我需要做的就是编写一个转换器,将我的 id 字符串表示形式转换为需求。然后春天会为我做剩下的事情。那么它会将字符串列表转换为需求列表吗?
  • 您需要注册它们。 -- 是的 - Spring 也会将其应用于列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 2011-02-04
相关资源
最近更新 更多