Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSF2.0-即使第一个验证器失败,也会调用第二个验证器_Java_Jsf_Jsf 2_Cdi_Myfaces - Fatal编程技术网

Java JSF2.0-即使第一个验证器失败,也会调用第二个验证器

Java JSF2.0-即使第一个验证器失败,也会调用第二个验证器,java,jsf,jsf-2,cdi,myfaces,Java,Jsf,Jsf 2,Cdi,Myfaces,我使用的是WAS8.0.0.5的MyFaces2.0.4和CDI(不能在不丢失CDI的情况下替换WAS8的JSF2.0版本) 我有两个自定义验证器注册到一个组件。第一个是多字段比较。第二个验证器使用CDI注入SSB,SSB使用实体管理器调用数据库 如果我输入的信息导致第一个验证器故意失败,第二个验证器仍会执行。为什么?如果第一次验证失败,如何避免第二次验证?我认为,如果一个验证器失败,那么所有后续的验证都会被绕过 <h:form id="registrationForm">

我使用的是WAS8.0.0.5的MyFaces2.0.4和CDI(不能在不丢失CDI的情况下替换WAS8的JSF2.0版本)

我有两个自定义验证器注册到一个组件。第一个是多字段比较。第二个验证器使用CDI注入SSB,SSB使用实体管理器调用数据库

如果我输入的信息导致第一个验证器故意失败,第二个验证器仍会执行。为什么?如果第一次验证失败,如何避免第二次验证?我认为,如果一个验证器失败,那么所有后续的验证都会被绕过

<h:form id="registrationForm">
    <fieldset>
        <p:messages id="messages" showDetail="true" autoUpdate="true" closable="true" />
        <legend>Register</legend>
        <div class="form-row">
            <h:outputLabel for="userId" value="*User Id"/>
            <h:inputText id="userId" value="#{registration.userId}" required="true" size="20">
                <f:validator validatorId="userIdPasswordValidator" />
                <f:attribute name="passwordComponent" value="#{passwordComponent}"/>
                <f:validator binding="#{duplicateUserValidator}" /> <-- uses CDI
            </h:inputText>
        </div>
        <div class="form-row">
            <h:outputLabel for="password" value="*Password"/>
            <h:inputSecret id="password" type="password" binding="#{passwordComponent}" value="#{registration.password}" required="true">
            </h:inputSecret>
        </div>
        <div class="form-row">
            <h:outputLabel for="confirmPassword" value="*Confirm Password"/>
            <h:inputSecret id="confirmPassword" type="password" value="#{registration.confirmPassword}" required="true" />
        </div>
        <div class="form-row">
            <h:commandButton styleClass="btn btn-warning" value="Register" type="submit" action="#{registration.register}" />
        </div>
    </fieldset>
</h:form>
第二验证器:

@FacesValidator("userIdPasswordValidator")
public class UserIdPasswordValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        String userId = (String)value;
        UIInput passwordInput = (UIInput)component.getAttributes().get("passwordComponent");
        String password = (String) passwordInput.getSubmittedValue();

        if (userId.equals(password)) {
            FacesMessage message = new FacesMessage(null, "The Password cannot be the same as your User ID.");
            throw new ValidatorException(message);
        }
    }
}
@Named
@RequestScoped
public class DuplicateUserValidator implements Validator {

@Inject
UserService userService;

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {

    if (userService.getUser(value.toString()) != null) {
        FacesMessage message = new FacesMessage(null, "This User ID is already registered. Please logon or choose another one to register.");
        throw new ValidatorException(message);
    }
}

}

要实现所需的结果,您应该调用
renderResponse()
,如以下oracle摘录所示:

如果在当前FacesContext上有任何名为renderResponse的验证方法或事件侦听器,JavaServerFaces实现将跳到渲染响应阶段


但恐怕这就是验证阶段的工作方式

在此阶段,JavaServer面向实现处理树中组件上注册的所有验证器。它检查指定验证规则的组件属性,并将这些规则与为组件存储的本地值进行比较

如果本地值无效,JavaServerFaces实现将向FacesContext实例添加错误消息


这里的关键短语是处理所有验证器,并向FacesContext实例添加错误消息。虽然这里不是很清楚,但它意味着整个验证阶段将完成,消息将排队。完成后,它将移动到适当的阶段。

要实现所需的结果,您应该调用
renderResponse()
,如以下oracle摘录所示:

如果在当前FacesContext上有任何名为renderResponse的验证方法或事件侦听器,JavaServerFaces实现将跳到渲染响应阶段


但恐怕这就是验证阶段的工作方式

在此阶段,JavaServer面向实现处理树中组件上注册的所有验证器。它检查指定验证规则的组件属性,并将这些规则与为组件存储的本地值进行比较

如果本地值无效,JavaServerFaces实现将向FacesContext实例添加错误消息


这里的关键短语是处理所有验证器,并向FacesContext实例添加错误消息。虽然这里不是很清楚,但它意味着整个验证阶段将完成,消息将排队。完成后,它将进入相应的阶段。

谢谢。看起来我将把这两个验证器合并成一个自定义验证器或两个验证器的包装器。谢谢。看起来我将把这两个验证器合并成一个自定义验证器或两个验证器的包装器。