2

これは、ピンを要求する複合コンポーネントであるペティシオナリオです。必須ではありませんが、何かを入力する場合は数値でなければならず、アプリはデータベースを検索するため、他の人が同じ番号を持つことはありません:

<?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>   

ap:dialog の peticionario コンポーネントを使用したページ _clear.xhtml です。

<?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のvalidateメソッドです

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);
}       
}

検証は実際に行われます:)しかし、メッセージは取得できません:(

4

1 に答える 1

2
<h:inputText id="numDoc" ... /> 
<h:message for="peticionario_form:numDoc" ... />

これは一致しません。あなたが使用している必要があります

<h:inputText id="numDoc" ... /> 
<h:message for="numDoc" ... />

これまでに投稿されたコードには表示されていない別の考えられる原因は、ajax リクエストを送信しているが、メッセージ コンポーネントをまったく再レンダリングしていないことです。ajax リクエストで、メッセージ コンポーネントまたはその親の少なくとも 1 つを再レンダリング (更新) していることを確認する必要があります。


具体的な問題とは関係ありませんが、検証メッセージを準備する方法がぎこちないです。メッセージを手動でコンテキストに追加する必要はありません。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);

次のワンライナーだけで十分でした:

throw new ValidatorException(new FacesMessage(
    FacesMessage.SEVERITY_ERROR, "ya existe un usuario con el numero de documento ingresado", null);
于 2012-12-06T11:49:44.103 に答える