避免已经存在更新验证并在Spring MVC中进行更新

时间:2014-10-13 04:14:50

标签: java spring-mvc

我正在使用Spring MVC创建一个简单的CRUD。我使用相同的表单进行插入和编辑。我已经为name字段创建了一个验证,以检查该值是否已存在。如何在编辑验证中避免这种情况,如何进行更新?

这是代码

ItemController.java

@RequestMapping(method = RequestMethod.POST)
public String processForm(  @Validated  ItemForm itemForm, BindingResult result,
        Map model) {                                
    if (result.hasErrors()) {           
        model.put("typeList", dao.getItemTypes());
        return "itemmaster";
    }
    dao.insertItems(itemForm);      
    return "redirect:dashboard";
}

这是jsp页面

<form:form action="itemmaster.html"  commandName="itemForm">
<table width="100%" border="0">
    <tr>
        <td width="7%">Name:</td>
        <c:choose>
<c:when test="${not empty name}">
   <td width="11%"><form:input path="nameUpdate" /></td><td width="82%"><form:errors cssStyle="color:red" path="nameUpdate"/></td>
</c:when>
<c:otherwise>
    <td width="11%"><form:input path="name" /></td><td width="82%"><form:errors cssStyle="color:red" path="name"/></td>
</c:otherwise>
</c:choose>                     
    </tr>       
        <td>Description:</td><td><form:textarea path="description" /></td><td width="13%"><form:errors path="description" cssStyle="color:red"/></td>
    </tr>
    <tr>
        <td></td><td><input type="submit" value="Submit" /></td>
    </tr>
</table>
</form:form>

提前致谢。

1 个答案:

答案 0 :(得分:2)

恕我直言,您不应该在验证器中进行重复测试。您应该从 logic 验证中分离正式验证(处理空字段和可接受的格式)。第一部分仅依赖于输入值,后者可能依赖于外部上下文,例如数据库。只有第一部分应该在自动验证中完成。

我的建议是:

  • 使用不同的控制器方法进行更新和插入
  • 从验证程序中删除重复的测试
  • 插入方法中的
  • 添加重复测试

    public String processForm(  @Validated  ItemForm itemForm, BindingResult result,
            Map model) {
        if (hasDuplicatedName(itemForm) {
            result.reject(DUPLICATE, "Name is already in use");
        }
        if (result.hasErrors()) {           
            model.put("typeList", dao.getItemTypes());
            return "itemmaster";
        }
        ...
    

您还可以使用事务划分作为规则:如果您需要将数据库读取到测试,则不应在控制器中进行,而是在服务级别完成。我经常将绑定结果传递给服务层(作为Error)以在此级别执行逻辑测试,仍然能够在视图中稍后显示错误