2012-06-09 4 views
3

내가 새로운 검증 만들어 찾을 수 없습니다명명 된 객체는

package com.example.jsf.validator; 

import com.example.components.LoginFormValue; 
import com.example.ejb.SecurityEjb; 
import java.io.Serializable; 
import javax.ejb.EJB; 
import javax.enterprise.context.ApplicationScoped; 
import javax.faces.application.FacesMessage; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.validator.Validator; 
import javax.faces.validator.ValidatorException; 
import javax.inject.Named; 

/** 
* Validator for {@code login-form} component. 
* 
* @author steve 
*/ 
@Named 
@ApplicationScoped 
public class LoginValidator implements Validator, Serializable 
{ 
    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException 
    { 
     if (value == null) 
     { 
      return; 
     } 

     LoginFormValue loginFormValue = (LoginFormValue) value; 
     if (securityEjb.checkCredentials(loginFormValue.getEmailAddress(), loginFormValue.getPassword())) { 
      return; 
     } 

     throw new ValidatorException(new FacesMessage("Incorrect email address/password")); 
    } 

    @EJB 
    private SecurityEjb securityEjb; 
} 

을하지만 그것을 사용하려고하면

내가 페이지를로드 할 때
<my:login-form emailAddress="#{loginBean.emailAddress}" 
       rememberMe="#{loginBean.rememberMe}" 
       actionListener="#{loginBean.submit()}" 
       recoverPasswordOutcome="recover-password" 
       registerOutcome="signup"> 
    <f:validator validatorId="#{loginValidator}"/> 
</my:login-form> 

나는이 예외가 표시 얻을 :

javax.faces.FacesException: Expression Error: Named Object: [email protected] not found. 

코드 위반 줄 :

com.sun.faces.application.ApplicationImpl.createValidator(ApplicationImpl.java:1593) 

JSF가 실제로 유효성 검증기 bean 클래스를 해석하지만 아직 인스턴스화 할 수없는 이유는 무엇입니까? 내 애플 리케이션의 다른 모든 유효성 검사기는 콩 NamedApplicationScoped이며 그들은 모두 잘 작동합니다. 나는 그들 모두를 <f:validator validatorId="{myValidatorBean}"/>을 사용하여 참조한다.

저는 GlassFish 3.1.2를 사용하고 있습니다.

+0

시도 '' – Daniel

+0

이미 수행했습니다. 이 경우 유효성 검사는 완전히 무시되고 dodgy 자격 증명은 작업 수신기에서 사용할 수 있으며 지정된 전자 메일 주소를 가진 사용자가 유효한 자격 증명을 제공했다고 가정합니다. –

+0

나는 여전히 복합 컴포넌트를 전체적으로 검증 할 수있는 가능성에 관심이 있지만 (결국, 변환 된 단일 값을 생성 할 수 있습니다.) [이 답변]에서 복합 컴포넌트 유효성 검사의 문제를 해결했습니다 (http : //stackoverflow.com/a/10966594/584670). –

답변

8

<f:validator validatorId>은 구체적인 유효성 검사기 인스턴스가 아닌 유효성 검사기의 ID를 참조해야합니다. 유효성 검사기의 ID는 정확히 @FacesValidator 값으로 지정했거나 faces-config.xml 접근 방법을 사용할 때 <validator-id>으로 지정되었습니다. 예 : 다음이다

@FacesValidator("myValidator") 

validatorId

<f:validator validatorId="myValidator" /> 

상관 EL 식으로 참조되는 도면은 제작 동안 밸리데이터 ID를 식별하는 String로 해결 될 것이다.

javax.faces.FacesException: Expression Error: Named Object: [email protected] not found.

당신이해야을 : 예외 메시지가 당신에게 시도로 [email protected] 콘크리트와 같은 Validator 인스턴스를 통과 때, 그것은 단지까지 종료하는 toString() 값은 결국 분명히 존재하지 않는 검증 ID로 전달되는 대신 <f:validator binding> 또는 <h:inputText validator>을 사용하십시오. 구체적인 인스턴스를 취할 수 있습니다.

<f:validator binding="#{myValidator}" /> 

복합 구성 요소로 전달 될 때 작동하지 않는다는 것은 다른 문제입니다. 즉, for 속성을 지정하지 않았으므로 복합 내부의 UIInput 구성 요소에는 적용되지 않습니다. 나는 다음과 같은 질문/대답이 그것을 해결하기 위해 완전히 적용될 것이라고 생각한다 : How to specify a validator for an input component inside a composite component?

+0

'validatorId = "# {myBean}"'은 다른 컴포지트가 아닌 다른 구성 요소에서 항상 효과가있었습니다. 직접 체험 해보십시오! 여기서 문제는 전체 양식의 유효성을 검사하려고한다는 것입니다.폼을'LoginFormValue' 인스턴스로 변환하는 backing 컴포넌트 클래스가 있는데, 그 후에 validator가 호출 될 것으로 예상했습니다. –

+0

그런 식으로 일한 적이 없습니다. 나는 Mojarra 2.1.9에서 시가를 시험해 보았습니다. 나는 네가 가진 예외를 정확하게 얻는다. 아마도 ' – BalusC

+0

과 혼동을 일으킬 수도 있습니다. 어떻게 작동하는지, 또는 왜 작동 하는지를 알면 엉망이 되겠지만 적어도 Mojarra 2.1.6을 포함하여 작동합니다. 그것은 내 애플 리케이션을 통해 여러 곳에서 오랫동안 나를 위해 일해 왔습니다. 나는 어디에서 아이디어를 얻었는지 잊어 버렸다. 아마도 어딘가에있을 것이다. –

0

나는 오늘 같은 문제가 있었고 "Validator 구현"을 추가하여이를 해결했다. 그건 내 실수 였어.

<ui:composition> 
    <h:inputText id="#{id}" value="#{value}" size="20"> 
     <f:validator validatorId="com.example.shop.validator.PhoneNumber"/> 
    </h:inputText> 
</ui:composition> 

@FacesValidator("com.example.shop.validator.PhoneNumber") 
public class PhoneNumber implements Validator { 

@Override 
public void validate(FacesContext facesContext, UIComponent uiComponent,  Object o) throws ValidatorException { 

}