清除/重置表单时禁用bean验证

Mah*_*leh 3 bean-validation jsf-2

CASE:表单包含用于输入部门名称的输入文本(不能为空或空白),以及用于选择父部门的下拉列表(可以为空),在输入数据时,按清除,支持bean中的clear方法有效正如预期的那样很好,但是当没有输入数据并按下清除时,名称上的bean验证非空白并且出现验证消息,并且我想在清除时禁用验证.

  1. 查看代码:


    部门名称:

    <h:outputLabel>Parent Department:</h:outputLabel>
        <ice:selectOneMenu id="parentDepartment" value="#{department.selectedParentDepartment}">               
          <f:selectItem/>
          <f:selectItems value="#{departmentBean.departmentList}" var="dept" 
           itemLabel="#{dept.name}" itemValue="#{dept.id}" />                            
        </ice:selectOneMenu> 
        <h:message for="parentDepartment" style="color:red" />        
    
    <ice:panelGroup>
        <h:commandLink value="Add New" action="#{departmentBean.addOrUpdateDepartment}" />
        <h:commandLink value="Add New" actionListener="#{departmentBean.clear}" />
    </ice:panelGroup>
    
    Run Code Online (Sandbox Code Playgroud)

  2. Bean验证:

    @NotBlank(message = "{name.required}") @Size(max = 25, message = "{long.value}") @Column(name = "name", length = 25, nullable = false) private String name;

  3. 支持Bean方法:

    public void clear() { setDepartmentObj(new Department()); setSelectedParentDepartment(0); }

Bal*_*usC 6

您可以让它刷新整个视图:

<h:commandLink value="Clear" action="#{bean.clear}" immediate="true" />
Run Code Online (Sandbox Code Playgroud)

public String clear() {
    return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true";
}
Run Code Online (Sandbox Code Playgroud)

immediate="true"将跳过其不具有所有输入分量的处理(和验证)immediate="true".

或者,要重新加载页面的JavaScript也应该:

<h:commandLink value="Clear" onclick="window.location.reload(); return false;" />
Run Code Online (Sandbox Code Playgroud)

根据您想要部分请求的注释进行更新,然后使用ajax:

<h:commandLink value="Clear" action="#{bean.clear}">
    <f:ajax execute="@this" render="@form" />
</h:commandLink>
Run Code Online (Sandbox Code Playgroud)

public void clear() {
    field1 = null;
    field2 = null;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

因为execute设置为@this(顺便说一下,它已经是默认值,所以你可以省略它),它不会处理整个表单.