以编程方式使JSF/PrimeFaces中的输入清除值无效

以编程方式使JSF/PrimeFaces中的输入清除值无效,jsf,primefaces,Jsf,Primefaces,在业务验证之后,我想将UIInput设置为invalid,这样它就会变红并告诉用户出了什么问题。这是我的密码: <p:outputLabel value="Label" for="input"/> <p:inputText id="input" value="#{bean.selectedEntity.input}"/> <p:commandButton value="#{msg['button.save']}" icon="ui-icon-chec

在业务验证之后,我想将UIInput设置为invalid,这样它就会变红并告诉用户出了什么问题。这是我的密码:

 <p:outputLabel value="Label" for="input"/>
 <p:inputText id="input" value="#{bean.selectedEntity.input}"/>
 <p:commandButton value="#{msg['button.save']}" 
    icon="ui-icon-check" 
    action="#{bean.save()}" 
    update=":form, :growl" 
    oncomplete="if (args &amp;&amp; !args.validationFailed) PF('detailDlg').hide();"
 />

// bean code
UIInput c = (UIInput) context.getViewRoot().findComponent("form:input");
c.setValid(false);
这是错误还是预期的行为


Env:PrimeFaces 6.1、JSF Mojarra 2.2.14、Java 8、Spring Boot 1.5.4

JSF已经涵盖了您的需求,您不需要做更多的事情这里唯一要做的是:使用标准验证方式。 如果您使用的是Primefaces,当验证失败(并且您更新了表单)时,
ui状态错误
css类将自动添加到无效组件中

如果要向用户显示自定义错误样式,请按如下方式覆盖:

.ui-inputfield.ui-state-error, .ui-selectonemenu.ui-state-error {
    color: #dd6417 !important;
    border: 1px solid #dd6417 !important;
}
现在,组件被清除,因为在目标bean中,您正在清除值,或者是一个请求bean


如果您需要执行业务验证(访问数据库并检查某些内容),更好的方法是使用JSF验证器创建一个隐藏字段。

您的需求已经包含在JSF中,您不需要做更多的事情这里唯一要做的是:使用标准验证方式。 如果您使用的是Primefaces,当验证失败(并且您更新了表单)时,
ui状态错误
css类将自动添加到无效组件中

如果要向用户显示自定义错误样式,请按如下方式覆盖:

.ui-inputfield.ui-state-error, .ui-selectonemenu.ui-state-error {
    color: #dd6417 !important;
    border: 1px solid #dd6417 !important;
}
现在,组件被清除,因为在目标bean中,您正在清除值,或者是一个请求bean


如果需要执行业务验证(访问数据库并检查某些内容),更好的方法是使用JSF验证器创建一个隐藏字段。

为什么不使用普通的JSF验证器呢?不再需要手动处理findComponent()、setValid()等。验证在服务层的保存阶段完成,因为数据也可以从其他两个源导入。我只能捕获带有问题字段的“BusinessValidationException”……为什么不使用普通的JSF验证器呢?不再需要手动处理findComponent()、setValid()等。验证在服务层的保存阶段完成,因为数据也可以从其他两个源导入。我只能用有问题的字段捕获“BusinessValidationException”…我知道我可以添加css类,但我认为这有点棘手,我希望以“正确的方式”完成。我只是想知道,为什么输入被清除了。bean是视图范围的,我可以看到值是在调试期间设置的。。不幸的是,正如我在上面所写的,验证是在后端的保存阶段完成的,在保存到JSF验证器之前,我不能这样做。我知道我可以添加css类,但我认为这有点棘手,我想以“正确的方式”来做。我只是想知道,为什么输入被清除了。bean是视图范围的,我可以看到值是在调试期间设置的。。不幸的是,正如我在上面所写的,验证是在后端的保存阶段完成的,在保存到JSF验证器之前,我无法这样做。