나는 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 내 실제 사용 사례 없음) :
나는 복합 구성 요소 + 유효성 검사기 + 서블릿
를 사용하여 선호 Captcha에서 입력 한 값을 확인하는 방법으로 컨트롤러 빈 (@Named/@RequestScoped)을 사용하지 않는 것이 좋습니다.
Eclipse에서 유효성 검사기 코드를 디버깅 할 때 코드가 올바르게 동작합니다. 유일한 잘못된 것은 코드의 다음 부분이 Captcha의 구성 요소에서 "failureMessage"속성을 검색하지 않는다는 것입니다. 어떻게 해결할 수 있습니까? 항상 null입니다.
String summary = (String) component.getAttributes().get("failureMessage");
그래서 어떻게 콩 검증 문제를 해결할 수 있습니까?
그리고 어떻게 Validator에서 'failureMessage'속성을 올바르게 검색 할 수 있습니까?
나는 많은 것들을 시도해 보았고, 이제 나는 당신을 의지한다.
도움을 주셔서 미리 감사드립니다.
추신 : 현재 TomEE 1.5+, Java6을 사용하고 있습니다.
안녕하세요 Christophe, 게시 전 테스트했습니다. 나는 심지어 EL을 사용하지 않고 ** **를 수행했습니다. 그러나 오류가 남아 있습니다. 그리고 더 나쁜 것은, html5 속성 "placeholder"의 이점을 잃어 버렸습니다.이 속성은 기본값을 설정 한 경우 더 이상 사용되지 않습니다. 어쨌든 "value"속성을 설정해도 작업을 수행하지 못했습니다. –
paissad
HTML5 지원과 관련하여 JSF 2.2를 기다리거나 기다리지 않으려면 OmniFaces를 사용해야합니다. 또 다른 해결책은 페이지가로드 된 후에 JavaScript를 통해 자리 표시자를 추가하는 것입니다. –
내 스크린 샷에서 볼 수 있듯이, 자리 표시자는 이미 현재 작동 중입니다. 사실 OmniFaces를 사용하고 있습니다. – paissad