我正在尝试验证文本字段。
我有一个类customer
,其字段为name
:
@Size(min = 3, message = "At least 3 characters")
private String name;
这是index.xhtml
:
<p:outputLabel for="name" value="#{msg.name}" />
<p:inputText value="#{customer.name}" id="name" />
<h:message for="name"/>
<p:commandButton id="submit-button" value="#{msg.next}" action="next.xhtml"/>
当我输入一个短字符串(包含2个字母)时,我得到答复:
<?xml version='1.0' encoding='UTF-8'?>
<partial-response><changes><update id="j_id1:javax.faces.ViewState:0"><![CDATA[4215878805973597748:-123199067583012360]]></update><extension ln="primefaces" type="args">{"validationFailed":true}</extension></changes></partial-response>
因此,很明显,它认识到输入的名称太短,但是在视图中没有收到任何错误消息,如此处预期的那样:<h:message for="name"/>
。
答案 0 :(得分:2)
请考虑以下内容:
<p:commandButton id="submit-button" value="#{msg.next}" action="next.xhtml"/>
p:commandButton
是 Primefaces 库标签,并且是JSF h:commandButton
的增强版本。默认情况下, Primefaces 按钮处于启用状态。
在发布的示例中,当按下“推荐”按钮时,将处理表单(这是默认行为),并将显示next.xhtml
页面。
应用程序正在使用 bean验证来验证输入文本; p:inputText
标签。当用户在输入文本中输入2个字符的值并按下命令按钮验证正在发生时。显示了相同的页面,但是预期的验证消息“至少3个字符”未呈现到该页面。
人们可以在服务器日志中看到类似的信息(这是从Apache Tomcat的日志文件中获得的):
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute有 一些未处理的FacesMessages,这意味着并非每个FacesMessage都有一个 机会被渲染。这些未处理的FacesMessage是: -名称:至少需要2个字符!
这是因为请求最初是渲染next.xhtml
的;这是正常现象。如果输入的有效名称包含5个字符,则将按预期显示下一页。由于验证异常,当前页面会再次显示,但消息不会刷新到该页面。消息组件需要显式刷新。
更改此:
<h:message for="name"/>
收件人:
<h:message for="name" id="errmsg"/>
然后,在命令按钮中指定此消息组件需要在提交时进行更新。
更改此:
<p:commandButton id="submit-button" value="#{msg.next}" action="next.xhtml"/>
收件人:
<p:commandButton id="submit-button" value="#{msg.next}" action="next.xhtml" update="errmsg"/>
备用:
解决此问题的另一种方法是简单地提交一个非ajax请求,然后默认情况下将刷新整个页面-并且可以看到验证消息。在这种情况下,h:message
标记无需具有“ id”属性,并且可以将命令按钮声明为而没有的ajax行为为:
<p:commandButton ajax="false" id="submit-button" value="#{msg.next}" action="next.xhtml"/>
注释:
以上结论基于在Apache Tomcat 8 Web服务器,Apache MyFaces 2.2,Primefaces 5.3和Hibernate Bean Validator 5.2上尝试的代码。
答案 1 :(得分:0)
我认为p:commandButton
提交是一种Ajax提交,因此您必须明确定义要在查询完成后更新的组件。
由于您使用的是素字,请参见here is a validation展示中的示例。