Вы можете использовать дополнительный вспомогательный компонент, который будет проверять наличие сообщений проверки:
public class MessagesBean {
public List<FacesMessage> forComponent(String id) {
FacesContext context = FacesContext.getCurrentInstance();
UIViewRoot viewRoot = getContext().getViewRoot();
UIComponent component = findComponent(viewRoot, id, UIComponent.class);
if(component instanceof UIForm) {
return getMessagesRecursively(component);
}
return forComponent(context, component);
}
public List<FacesMessage> forComponent(FacesContext context, UIComponent component) {
List<FacesMessage> messages = new ArrayList<FacesMessage>();
if(component != null) {
Iterator<FacesMessage> msgItr = context.getMessages(component.getClientId(context));
while(msgItr.hasNext()) {
messages.add(msgItr.next());
}
}
return messages;
}
private List<FacesMessage> getMessagesRecursively(UIComponent parent) {
List<FacesMessage> messages = new ArrayList<FacesMessage>();
if(parent != null) {
FacesContext context = getContext();
Iterator<FacesMessage> msgItr = context.getMessages(parent.getClientId(context));
while(msgItr.hasNext()) {
messages.add(msgItr.next());
}
if(parent.getChildCount() > 0) {
for (UIComponent child : parent.getChildren()) {
List<FacesMessage> childMesssages = getMessagesRecursively(child);
if(childMesssages.size() > 0) {
messages.addAll(childMesssages);
}
}
}
}
return messages;
}
private <T> T findComponent(UIComponent base, String id, Class<T> returnType) {
if (id.equals(base.getId())) {
return returnType.cast(base);
}
Iterator<UIComponent> children = base.getFacetsAndChildren();
while (children.hasNext()) {
T component = findComponent(children.next(), id, returnType);
if (component != null) {
return returnType.cast(component);
}
}
return null;
}
}
Затем проверьте, есть ли у формы или определенного компонента сообщения:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jstl/core"
template="/WEB-INF/template/jnotify.xhtml">
<ui:param name="title" value="jnotify with jsf"/>
<ui:define name="content">
<h:form id="frmTest">
<h:outputText value="Submitted Text: #{not empty testBean.text ? testBean.text : 'N/A'}"/><br/>
<h:inputText id="txtTest" required="true"
value="#{testBean.text}"/>
<h:commandButton value="Submit"/>
<script type="text/javascript">
<c:forEach items="#{messagesBean.forComponent('frmTest')}" var="message">
$.jnotify("#{message.summary}", "#{message.severity}");
</c:forEach>
</script>
</h:form>
</ui:define>
</ui:composition>
В случае, если вывы используете JSF 1.2, вам потребуется jboss-el или аналогичный, чтобы включить параметризованные методы.