2012-06-09 2 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 bean, и все они работают отлично. Я ссылаюсь на них, используя <f:validator validatorId="{myValidatorBean}"/>.

Я использую GlassFish 3.1.2.

+0

попробовать '' – Daniel

+0

уже сделал. В этом случае проверка была полностью проигнорирована, а извиняемые учетные данные были доступны в прослушивателе действий, который к тому времени предполагает, что пользователь с указанным адресом электронной почты предоставил действительные учетные данные. –

+0

Хотя меня все еще интересует возможность проверки составного компонента в целом (в конце концов, мы можем сгенерировать на нем одно преобразованное значение), я решил проблему валидации составных компонентов в [этом ответе] (http : //stackoverflow.com/a/10966594/584670). –

ответ

8

<f:validator validatorId> должен ссылаться на идентификатор валидатора, а не на конкретный экземпляр валидатора. Идентификатор валидатора - это тот, который вы указали как значение @FacesValidator, или как <validator-id> при использовании подхода faces-config.xml. Например.

@FacesValidator("myValidator") 

, который затем будет ссылаться как

<f:validator validatorId="myValidator" /> 

Любое выражение ЭЛ в validatorId бы во время сборки просмотра быть разрешен к String, идентифицирующей валидатор ID. Поэтому при прохождении конкретного Validator экземпляра, он будет только в конечном итоге его toString() значения как [email protected] передается в качестве валидатора ID, который делает все-таки, очевидно, не существует, так как сообщение об исключении пытается сказать вам:

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

Вы должны используйте вместо этого <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} "' всегда работал для других некомпозитных компонентов. Попробуй сам! Я думаю, проблема здесь в том, что я пытаюсь проверить всю форму.У меня есть компонент компонента backing, который преобразует форму в экземпляр 'LoginFormValue', и я ожидал, что после этого будет вызван валидатор. –

+0

Это никогда не срабатывало. Я просто пробовал на Mojarra 2.1.9, без сигары. Я получаю именно ваше исключение. Возможно, вы сбиваете с толку '' – BalusC

+0

Buggered, если я знаю, как и почему он работает, но он делает - по крайней мере, вплоть до Mojarra 2.1.6 и включая Mojarra 2.1.6. Это работало для меня в течение длительного времени в нескольких местах в моем приложении. Я забыл, откуда у меня появилась идея - наверное, где-то на SO. –

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 { 

}