【发布时间】:2013-02-20 13:47:29
【问题描述】:
我在一个非常标准的 Java Web 应用程序 (jsf-2) 中使用 PrimeFaces,当我将 p:autoComplete 组件移动到它自己的自定义组件中时,我的所需消息显示出现问题..
首先,当 p:autoComplete 位于页面本身时 - 这工作正常(简化):
<h:panelGrid id="newRoleAdminGrid" >
<p:autoComplete id="newRoleAdminPerson"
style="position: relative; padding-right:5px"
value="#{roleList.newRoleAdminPerson}"
var="personVar"
itemValue="#{personVar}"
itemLabel="#{personVar.fullFamiliarName}"
forceSelection="true"
completeMethod="#{personAutoComplete.byGeneralCriteria}"
converter="PersonConverter"
minQueryLength="3"
maxResults="50"
scrollHeight="400"
size="50"
required="true"
requiredMessage="admin name is requiredd"
title="enter users first name, last name or login" >
</p:autoComplete>
<h:message for="newRoleAdminPerson" class="redError"/>
<p:commandButton value="add" ajax="true"
update="roleAdminTable,newRoleAdminGrid"
id="addRoleAdminBtn"
actionListener="#{roleList.newRoleAdmin}"
style="margin:5px;"
icon="ui-icon-plus"/>
</h:panelGrid>
看到上面的 h:message 了吗?当值为空白或未通过 PersonConverter 时,它可以完美运行并显示...
但是我的应用程序中到处都有相同的组件,所以我创建了一个自定义组件。
这是组件:
<cc:interface>
<cc:attribute name="id" type="String" required="true" />
<cc:attribute name="person" type="com.foo.bar.model.Person" required="true" />
<cc:attribute name="size" type="int" required="false" default="50" />
<cc:attribute name="required" type="boolean" required="false" default="false" />
<cc:attribute name="requiredMessage" type="String" required="false" default="required" />
</cc:interface>
<!-- IMPLEMENTATION -->
<cc:implementation>
<p:autoComplete id="#{cc.attrs.id}"
style="position: relative; padding-right:5px"
value="#{cc.attrs.person}"
var="personVar"
itemValue="#{personVar}"
itemLabel="#{personVar.fullFamiliarName}"
forceSelection="true"
completeMethod="#{personAutoComplete.byGeneralCriteria}"
converter="PersonConverter"
minQueryLength="3"
maxResults="50"
scrollHeight="400"
size="#{cc.attrs.size}"
required="#{cc.attrs.required}"
requiredMessage="#{cc.attrs.requiredMessage}"
title="enter users first name, last name or login" >
</p:autoComplete>
<h:message for="#{cc.attrs.id}" class="redError"/>
</cc:implementation>
这是现在的代码(使用自定义组件):
<h:panelGrid id="newRoleAdminGrid" >
<my:personLookup id="newRoleAdminPerson"
person="#{roleList.newRoleAdminPerson}"
required="true" requiredMessage="#{propUtil.appShortName} Admin Name is required"/>
<h:message for="newRoleAdminPerson" class="redError"/>
<p:commandButton value="add" ajax="true"
update="roleAdminTable,newRoleAdminGrid"
id="addRoleAdminBtn"
actionListener="#{roleList.newRoleAdmin}"
style="margin:5px;"
icon="ui-icon-plus"/>
</h:panelGrid>
当我以这种方式运行它时,组件可以工作 - 如果用户将其留空,或者它没有通过验证,primefaces 边框会变为红色,但 h:message 永远不会显示实际错误(requiredMessage 或在人转换器)
我已经尝试了很多不同的变体,例如仅在实现中设置 id 或仅在 my:personLookup 中设置 id,或两者兼而有之。
以前有人遇到过这个吗?我在做或设置不正确吗?谢谢你的时间!
【问题讨论】:
-
您是否尝试过改用
p:message? -
@elias 我确实有.. 另外,我似乎也无法在 p:messages 或 h:messages 中获得任何信息。
-
为什么你有
h:message在复合组件和它之外?你想要哪个message?如果你想在复合内使用message,只需将id="autocomplete"分配给autocomplete并将for="autocomplete"放入message。复合组件是命名容器,因此您无需担心 id 唯一性。 -
谢谢@partlov,我已经尝试过了,但其他更改否定了解决方案并最初隐藏了消息。您的 cmets 让我回到了正确的道路上,我将在下面为遇到此问题的其他人发布最终解决方案。
标签: java jsf jsf-2 primefaces