2012-09-15 2 views
2

내 영어가 좋지 않습니다. 미안합니다. 내 질문은 jsf 유효성 검사에 관한 것입니다. 유효성 검사 빈이 ValidatorException을 throw하면 내 관리 빈 save_method가 작동합니다.하지만 내 save_method가 작동하지 않습니다. . 전자 메일이 유효하지 않으면 내 save_method가 작동하지 않아야합니다.복합 구성 요소가있는 Jsf 유효성 검사가 제대로 작동하지 않습니다.

복합 인터페이스 검증 빈에 해당

<c:if test="#{cc.getValueExpression('validator')!=null}"> 
<p:inputText value="#{cc.attrs.value}" id="#{cc.attrs.id}" 
required="#{cc.attrs.required}" validator="#{cc.attrs.validator}"/> 

검증 방법 등

<composite:attribute name="validator" required="false" 
     method-signature="void Action(javax.faces.context.FacesContext, javax.faces.component.UIComponent,Object)" /> 

복합 구현.

@Override 
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
String email = (String) value; 
Pattern mask = null; 
mask = Pattern.compile(EMAIL_REGEX); 
Matcher matcher = mask.matcher(email); 

if (!matcher.matches()) { 
    messageManager.warn(MessageManager.Bundles.WO, "validator.message.email"); 

    throw new ValidatorException(new FacesMessage("hoppala")); 
} 
} 

및 관리 빈 저장 방법.

@Override 
    public boolean save() { 
     super.save(); 
} 

답변

3

mojarra 버전 2.1.10 이하에서 작업 하시겠습니까? 최근에 고정 된 was a bug이 있습니다. 가능하면 2.1.13의 최신 버전으로 업데이트하십시오. 그러나 어쨌든, JSF에서는 그것을 당신이 설명했던대로하지 않을 것입니다. 나는이 같은 <f:validator/>를 사용하여 검증을 적용하는 것이 좋습니다 :

<mytags:customInput value="#{validationModel.value}"> 
    <f:validator for="input" validatorId="org.validationexample.EmailValidator" /> 
</mytags:customInput> 

그리고 당신의 복합 구성 요소를 구현해야합니다 <cc:editableValueHolder> :

<cc:interface> 
    <cc:attribute name="value"/> 
    <cc:editableValueHolder name="input" targets="inputText"/> 
</cc:interface> 

<cc:implementation> 
    <p:inputText id="inputText" value="#{cc.attrs.value}" /> 
</cc:implementation> 

그리고 마지막으로 당신의 검증이 전용 검사기 클래스에 의해 처리됩니다

@FacesValidator("org.validationexample.EmailValidator") 
public class EmailValidator implements Validator { 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     // your validation here 
    } 

} 

어쨌든 다른 접근법이나 맛이 있습니다. <f:validator>을 복합 컴포넌트의 <p:inputText> 안에 직접 배치 할 수도 있습니다. <f:validator>에는 disabled 속성이 있기 때문에 필요에 따라 비활성화 할 수 있습니다. 또 다른 방법은 Bean Validation을 사용하고 Hibernate Validator과 함께 제공되는 기존 EmailValidator를 가져 오는 것입니다. 이 경우 @Email 주석을 속성 위에 설정하면됩니다.

+0

+1 당신은이 질문에 나를 이겼습니다. ''를 사용하여 패싯을 복합 컴포넌트에도 삽입하는 것도 가능하지 않습니까? –

+0

좋은 답변, 고맙습니다. – mstzn

+0

@maple_shaft 선택적으로 유효성 검사기 (?)를 적용하기 위해 패싯을 사용하려는 경우 - 아니요. 어쩌면 내가 잘못 이해 했는지도 몰라. – fischermatte

관련 문제