Omnifaces validateBean:无法让 showMessageFor attirbute 工作
Omnifaces validateBean: can not get showMessageFor attirbute to work
我正在使用 Omnifaces <o:validateBean />
to use JSR303 bean validation with a class level constraint. My question is based on a former question about 。自 Omnifaces 2.6 以来,有一个 showMessageFor
属性完全解决了我当时的问题(非常感谢 Omnifaces 库的开发人员 ;-)。我的问题是我无法让它工作。
这是我的设置。我有三个输入字段,其中两个在 class 级别约束中耦合(weddingDay 必须小于 silverWeddingAnniversary;如有必要,我可以附加更多代码)。
@DayIsBeforeAnniversary
@Entity
public class Person implements Serializable
{
private String name;
@Temporal(TemporalType.DATE)
private Date weddingDay;
@Temporal(TemporalType.DATE)
private Date silverWeddingAnniversary;
...
}
<h:form id="main_form">
<p:messages />
<p:outputLabel value="Name" for="id_name" />
<p:message for="id_name" />
<p:inputText id="id_name" value="#{personController.person.name}" /><br />
<p:outputLabel value="Wedding Day" for="id_wedding" />
<p:message for="id_wedding" />
<p:calendar id="id_wedding" value="#{personController.person.weddingDay}" /><br />
<p:outputLabel value="Silver Wedding Anniversary" for="id_anniversary" />
<p:message for="id_anniversary" />
<p:calendar id="id_anniversary" value="#{personController.person.silverWeddingAnniversary}" /><br/>
<p:commandButton
value="test"
action="#{personController.navigate()}"
update="@all"/>
<o:validateBean
value="#{personController.person}"
showMessageFor="id_wedding id_anniversary" />
</h:form>
所以我的目的是在 <p:message/>
标签中显示验证消息,该标签对应于我指定 ID (showMessageFor="id_wedding id_anniversary"
) 的两个 <p:calendar/>
标签。
实际结果有点不同。常规 <p:messages/>
标记中显示两条消息。并且所有输入字段都以红色突出显示(甚至名称的输入;每个输入和标签都有 class="ui-state-error")。实际上,当我完全省略 showMessageFor 属性时并没有太大区别(除了 <p:messages/>
中只呈现一条消息)。
那么我分别做错了什么?我怎样才能告诉错误消息出现在两个特定的 <p:message/>
标签中,我怎样才能防止无关名称的输入字段变成红色?
(在 Glassfish 4.1.1 上使用 Omnifaces 2.6.8)
问题有两个。
showMessageFor
属性无意中将客户端 ID 解释为完整的客户端 ID。以下方法适合您。
<o:validateBean
value="#{personController.person}"
showMessageFor="main_form:id_wedding main_form:id_anniversary" />
showMessageFor
不用于仅将特定输入字段标记为无效。不幸的是,除了抓取 <o:validateOrder>
之外没有其他解决方法。
<o:validateOrder
components="id_wedding id_anniversary"
message="You cannot celebrate wedding anniversary before being married"
showMessageFor="@all" />
根据 issue 446。
这两个问题已在 2.6.9 中得到修复
我正在使用 Omnifaces <o:validateBean />
to use JSR303 bean validation with a class level constraint. My question is based on a former question about showMessageFor
属性完全解决了我当时的问题(非常感谢 Omnifaces 库的开发人员 ;-)。我的问题是我无法让它工作。
这是我的设置。我有三个输入字段,其中两个在 class 级别约束中耦合(weddingDay 必须小于 silverWeddingAnniversary;如有必要,我可以附加更多代码)。
@DayIsBeforeAnniversary
@Entity
public class Person implements Serializable
{
private String name;
@Temporal(TemporalType.DATE)
private Date weddingDay;
@Temporal(TemporalType.DATE)
private Date silverWeddingAnniversary;
...
}
<h:form id="main_form">
<p:messages />
<p:outputLabel value="Name" for="id_name" />
<p:message for="id_name" />
<p:inputText id="id_name" value="#{personController.person.name}" /><br />
<p:outputLabel value="Wedding Day" for="id_wedding" />
<p:message for="id_wedding" />
<p:calendar id="id_wedding" value="#{personController.person.weddingDay}" /><br />
<p:outputLabel value="Silver Wedding Anniversary" for="id_anniversary" />
<p:message for="id_anniversary" />
<p:calendar id="id_anniversary" value="#{personController.person.silverWeddingAnniversary}" /><br/>
<p:commandButton
value="test"
action="#{personController.navigate()}"
update="@all"/>
<o:validateBean
value="#{personController.person}"
showMessageFor="id_wedding id_anniversary" />
</h:form>
所以我的目的是在 <p:message/>
标签中显示验证消息,该标签对应于我指定 ID (showMessageFor="id_wedding id_anniversary"
) 的两个 <p:calendar/>
标签。
实际结果有点不同。常规 <p:messages/>
标记中显示两条消息。并且所有输入字段都以红色突出显示(甚至名称的输入;每个输入和标签都有 class="ui-state-error")。实际上,当我完全省略 showMessageFor 属性时并没有太大区别(除了 <p:messages/>
中只呈现一条消息)。
那么我分别做错了什么?我怎样才能告诉错误消息出现在两个特定的 <p:message/>
标签中,我怎样才能防止无关名称的输入字段变成红色?
(在 Glassfish 4.1.1 上使用 Omnifaces 2.6.8)
问题有两个。
showMessageFor
属性无意中将客户端 ID 解释为完整的客户端 ID。以下方法适合您。<o:validateBean value="#{personController.person}" showMessageFor="main_form:id_wedding main_form:id_anniversary" />
showMessageFor
不用于仅将特定输入字段标记为无效。不幸的是,除了抓取<o:validateOrder>
之外没有其他解决方法。<o:validateOrder components="id_wedding id_anniversary" message="You cannot celebrate wedding anniversary before being married" showMessageFor="@all" />
根据 issue 446。
这两个问题已在 2.6.9 中得到修复