2013-01-16 1 views
1

나는 h : 양식에 사용하는 복합 구성 요소 (실제로는 captcha)가 있습니다.
내 h : 양식의 제출 버튼을 클릭 할 때 다음과 같은 오류가 발생합니다.JSF 2 - composite-component - 값이 비어있는 구성 요소로 인해 Bean 유효성 검사가 실패 함

16janv. 2013 10시 2분 6초 javax.faces.validator.BeanValidator
주의의 유효성을 검사 : 빈 값으로 구성 요소를 확인할 수 없습니다 : 보안 문자 : captchaText 여기

는 보안 문자의 복합 구성 요소의 XHTML 코드

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:composite="http://java.sun.com/jsf/composite" xmlns:xcc="http://java.sun.com/jsf/composite/components"> 
<h:body> 

    <composite:interface> 
    <composite:attribute name="id" type="java.lang.String" /> 
    <composite:attribute name="imageWidth" type="java.lang.Integer" /> 
    <composite:attribute name="imageHeight" type="java.lang.Integer" /> 
    <composite:attribute name="imageClass" type="java.lang.String" /> 
    <composite:attribute name="inputClass" type="java.lang.String" default="" /> 
    <composite:attribute name="placeholder" type="java.lang.String" default="" /> 
    <composite:attribute name="failureMessage" type="java.lang.String" default="Captcha validation failed" /> 

    <composite:editableValueHolder name="captchaText" /> 
    </composite:interface> 

    <composite:implementation> 
    <h:inputText id="captchaText" required="true" styleClass="#{cc.attrs.inputClass}" placeholder="#{cc.attrs.placeholder}" 
     autocomplete="off" maxlength="10"> 
     <f:param name="failureMessage" value="#{cc.attrs.failureMessage}" /> 
     <f:validateLength minimum="6" /> 
     <f:validator validatorId="captchaValidator" /> 
    </h:inputText> 
    <h:graphicImage id="captchaImage" alt="" style="margin-left:3px;" styleClass="#{cc.attrs.imageClass}" width="#{cc.attrs.imageWidth}" 
     height="#{cc.attrs.imageHeight}" value="__captcha.jpg" /> 
    </composite:implementation> 

</h:body> 
</html> 

여기 Captcha의 JSF 검사기 코드가 있습니다.

import javax.faces.application.FacesMessage; 


import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.validator.FacesValidator; 
import javax.faces.validator.Validator; 
import javax.faces.validator.ValidatorException; 

import net.paissad.waqtsalat.servlet.CaptchaServlet; 

    @FacesValidator(CaptchaValidator.VALIDATOR_ID) 
    public class CaptchaValidator implements Validator { 

    public static final String VALIDATOR_ID = "captchaValidator"; 

    @Override 
    public void validate(final FacesContext context, final UIComponent component, final Object value) throws ValidatorException { 

     final String enteredValue = (String) value; 
     final String expectedValue = (String) context.getExternalContext().getSessionMap() 
      .get(CaptchaServlet.CAPTCHA_KEY); 

     final boolean ok = (enteredValue != null) && (enteredValue.equals(expectedValue)); 
     if (!ok) { 
      String summary = (String) component.getAttributes().get("failureMessage"); 
      if (summary == null) summary = ""; 
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, summary)); 
     } 
    } 

} 

실제 captcha 이미지를 작성하는 CaptchaServlet의 코드를 표시 할 필요가 없습니다. 내가 말할 수있는 것은 그것이 잘 작동한다는 것입니다. 나는이 코드 here에서 영감을 얻었다.

여기는 기본적으로 내 양식에 복합 요소를 사용하는 방법입니다. (프랑스어 현지화) 양식이 같은 렌더링

<h:form> 
    <xcc:captcha id="captcha" imageClass="img-rounded" placeholder="#{i18n.Captcha_enter_code_here}" failureMessage="Captcha validation failed" /> 
    <h:commandButton styleClass="btn btn-success" type="submit" value="#{i18n.Submit}" 
      actionListener="#{accountRegistrationController.register}" action="success" /> 
</h:form> 

(이 BTW 내 실제 사용 사례 없음) :

enter image description here

나는 복합 구성 요소 + 유효성 검사기 + 서블릿
를 사용하여 선호 Captcha에서 입력 한 값을 확인하는 방법으로 컨트롤러 빈 (@Named/@RequestScoped)을 사용하지 않는 것이 좋습니다.

Eclipse에서 유효성 검사기 코드를 디버깅 할 때 코드가 올바르게 동작합니다. 유일한 잘못된 것은 코드의 다음 부분이 Captcha의 구성 요소에서 "failureMessage"속성을 검색하지 않는다는 것입니다. 어떻게 해결할 수 있습니까? 항상 null입니다.

String summary = (String) component.getAttributes().get("failureMessage"); 

그래서 어떻게 콩 검증 문제를 해결할 수 있습니까?
그리고 어떻게 Validator에서 'failureMessage'속성을 올바르게 검색 할 수 있습니까?

나는 많은 것들을 시도해 보았고, 이제 나는 당신을 의지한다.
도움을 주셔서 미리 감사드립니다.

추신 : 현재 TomEE 1.5+, Java6을 사용하고 있습니다.

답변

1

inputText 태그에 value 속성이 없습니다. value 속성은 입력과 빈 사이의 바인딩을 수행합니다.

<h:inputText value="#{yourBean.yourValue" ... 
+0

안녕하세요 Christophe, 게시 전 테스트했습니다. 나는 심지어 EL을 사용하지 않고 ** **를 수행했습니다. 그러나 오류가 남아 있습니다. 그리고 더 나쁜 것은, html5 속성 "placeholder"의 이점을 잃어 버렸습니다.이 속성은 기본값을 설정 한 경우 더 이상 사용되지 않습니다. 어쨌든 "value"속성을 설정해도 작업을 수행하지 못했습니다. – paissad

+0

HTML5 지원과 관련하여 JSF 2.2를 기다리거나 기다리지 않으려면 OmniFaces를 사용해야합니다. 또 다른 해결책은 페이지가로드 된 후에 JavaScript를 통해 자리 표시자를 추가하는 것입니다. –

+0

내 스크린 샷에서 볼 수 있듯이, 자리 표시자는 이미 현재 작동 중입니다. 사실 OmniFaces를 사용하고 있습니다. – paissad