2011-09-23 160 views
7

我需要验证存储在我的表单bean对象列表中的对象。如何对嵌套列表对象进行Hibernate验证?

下面是我的表单bean对象。

public class Role implements java.io.Serializable { 

    // Fields  
    private int roleId; 

    @NotBlank 
    private String roleName; 

    private boolean active; 

    @Valid 
    private List<Module> modules; 

    // getters anfd setters 
} 

以下是我的对象,它是存在于我的主要形式bean对象的列表

public class Module implements Serializable { 

    private int id; 

    @NotBlank 
    private String moduleName; 

    // other properties and getters and setters 
} 

下面是我的属性文件

# -- Role form -- 
NotBlank.role.roleName=Role Name can not be blank. 
NotBlank.module.moduleName=Module Name can not be blank. 

下面是我的JSP页面中,表单由角​​色名称和可以添加到角色的模块组成。

<table border="0" class="section_tbl2"> 
    <tr> 
     <td width="150px" valign="top"> 
      <spring:message code="dmx.role.form.label.name"/> 
     </td> 
     <td width="10px">:</td> 
     <td> 
      <form:input class="txtinput" id="roleName" path="roleName" maxlength="50"/>  <form:errors path="roleName" cssClass="error"/> 

     </td> 
    </tr> 
    <tr><td colspan="3" height="8px"></td></tr> 

    <tr> 
     <td width="150px" vAlign="top"> 
      Modules 
     </td> 
     <td width="10px" vAlign="top">:</td> 
     <td> 

      <table> 
       <tr> 
        <td> 
         <input type="button" value="<spring:message code="dmx.role.form.button.addModule.label"/>" onclick="return addModuleRow();"></input> 
        </td> 
       </tr> 
       <tr><td>&nbsp;</td></tr> 
      </table> 

      <table cellpadding="0" cellspacing="0" border="0" class="tblstyle1" id="moduleTable"> 
       <thead> 
        <tr> 
         <th class="fst" width="200px"> 
          <spring:message code="dmx.role.form.label.moduleName"/> 
         </th> 
         <th width="50px"><spring:message code="dmx.role.form.label.create"/></th> 
         <th width="50px"><spring:message code="dmx.role.form.label.update"/></th> 
         <th width="50px"><spring:message code="dmx.role.form.label.delete"/></th> 
         <th width="30px"></th> 
        </tr> 
       </thead> 
       <tbody id="moduleTBody"> 
        <c:forEach items="${role.modules}" var="module" varStatus="status" > 
         <c:set var="moduleCounter" value="${status.index}"/> 
         <tr id="moduleRowId_${moduleCounter}"> 
          <td class="fst txt-center"> 
           <form:select onchange="checkIfThisModuleAlreadySelected(this);" class="seloption" id="selectedModule_${moduleCounter}" path="modules[${moduleCounter}].id"> 
            <form:option value="" label="-- Select Module --"/> 
            <form:options items="${moduleList}" itemLabel="moduleName" itemValue="id" /> 
           </form:select> 
          </td> 
          <td class="txt-center"> 
           <form:checkbox id="create_${moduleCounter}" path="modules[${moduleCounter}].create"/> 
          </td> 
          <td class="txt-center"> 
           <form:checkbox id="update_${moduleCounter}" path="modules[${moduleCounter}].update"/> 
          </td> 
          <td class="txt-center"> 
           <form:checkbox id="delete_${moduleCounter}" path="modules[${moduleCounter}].delete"/> 
          <td class="txt-center"> 
           <input class="delbtn" id="moduleDelBtn_${moduleCounter}" name="moduleDelBtn[${moduleCounter}]" type="button" onclick="delModuleRow(${moduleCounter});"> 
          </td> 
         </tr> 
        </c:forEach> 
       </tbody>  
      </table>     
     </td> 
    </tr> 
    <tr><td colspan="3" height="3px"></td></tr> 
</table> 

我可以成功地验证了角色名即当角色名是空白的,我得到一个错误消息,但在没有选择的模块我没有得到任何错误消息。

请帮

回答

14

添加@NotNull@Size约束你的模块列表应该有所帮助:

@Valid 
@NotNull 
@Size(min = 1) 
private List<Module> modules; 

@Valid注释导致注释集合中的元素进行验证,但它不验证阉那集合不为null或包含任何元素。

相关问题