这是peticionario,一个复合组件,要求你提示。这不是强制性的,但如果你填写的东西必须是数字,应用程序将在数据库中查找,所以没有其他人具有相同的数字:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:cc="http://java.sun.com/jsf/composite"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:dabit="http://java.sun.com/jsf/composite/components">
<cc:interface>
<cc:attribute name="peticionarioB" />
</cc:interface>
<cc:implementation>
<h:form id="peticionario_form">
<p:panel id="unooo">
<h:panelGrid columns="2" id="ohruiseñor">
<f:facet name="header">
<h:outputText value="Datos personales"/>
</f:facet>
<h:outputText value="Número de documento"/>
<h:panelGroup>
<h:inputText
id="numDoc"
validator="#{radicadoOficioBean.validarPeticionario}"
value="#{peticionarioBean.peticionario.numDocumento}">
<f:validateLongRange/>
</h:inputText>
<h:message for="peticionario_form:numDoc" style="color:red"/>
</h:panelGroup>
</h:panelGrid>
</p:panel>
</h:form>
这是_crear.xhtml,一个在p:对话框中使用peticionario组件的页面
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:dabit="http://java.sun.com/jsf/composite/components">
<h:body>
<h:form id="form">
<p:panel header="Radicación de oficio" >
<p:dialog
header="Creación de peticionario"
id="peticionario_dialog"
widgetVar="peticionario_dlg">
<dabit:peticionario peticionarioB="#{radicadoOficioBean.peticionarioBean}"/>
<p:ajax
event="close"
update="form:peticionarioExistentePG"/>
</p:dialog>
</h:body>
</html>
这是RadicadoOficioBean的验证方法
public void validarPeticionario (FacesContext context, UIComponent component, Object value) {
if (value == null) {
return;
}
Long l = new Long(value.toString());
if (DAOBase.findByUniqueLongProperty(Peticionario.class, "numDocumento", l) != null) {
FacesMessage fm = new FacesMessage("ya existe un usuario con el numero de documento ingresado");
context.addMessage(component.getClientId(), fm);
fm.setSeverity(FacesMessage.SEVERITY_ERROR);
System.out.println(component.getClientId());
throw new ValidatorException(fm);
}
}
验证实际上发生了:)但是我无法得到的消息:(
答案 0 :(得分:2)
<h:inputText id="numDoc" ... />
<h:message for="peticionario_form:numDoc" ... />
这不匹配。你应该使用
<h:inputText id="numDoc" ... />
<h:message for="numDoc" ... />
到目前为止发布的代码中不可见的另一个可能原因是您发送的是ajax请求,但根本没有重新呈现消息组件。您应该确保在ajax请求中重新呈现(更新)消息组件或至少一个父组件。
无关,准备验证消息的方式很笨拙。不必手动将消息添加到上下文中。当ValidatorException
被JSF捕获时,该工作已经完成。
FacesMessage fm = new FacesMessage("ya existe un usuario con el numero de documento ingresado");
context.addMessage(component.getClientId(), fm);
fm.setSeverity(FacesMessage.SEVERITY_ERROR);
System.out.println(component.getClientId());
throw new ValidatorException(fm);
以下oneliner就足够了:
throw new ValidatorException(new FacesMessage(
FacesMessage.SEVERITY_ERROR, "ya existe un usuario con el numero de documento ingresado", null);