没有出现“ JSF验证错误”消息

时间:2018-11-01 23:25:25

标签: java validation jsf java-ee

我正在尝试验证文本字段。

我有一个类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"/>

2 个答案:

答案 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展示中的示例。