首页 / JAVA / java – 找不到命名对象
java – 找不到命名对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 找不到命名对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2779字,纯文字阅读大概需要4分钟。
内容图文
![java – 找不到命名对象](/upload/InfoBanner/zyjiaocheng/748/a9ad685c0f8b480dabd6d881f6868e1b.jpg)
我创建了一个新的验证器:
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: com.example.jsf.validator.LoginValidator@31888ef8 not found.
令人讨厌的代码行是:
com.sun.faces.application.ApplicationImpl.createValidator(ApplicationImpl.java:1593)
为什么JSF实际上可以解析验证器bean类但却无法实例化它?我的应用程序中的每个其他验证器都是一个命名的ApplicationScoped bean,它们都可以正常工作.我使用< f:validator validatorId =“{myValidatorBean}”/>来引用它们.
我正在使用GlassFish 3.1.2.
解决方法:
< f:validator validatorId>必须引用验证器的ID,而不是具体的验证器实例.验证器的ID正是您指定为@FacesValidator值或< validator-id>的ID.使用faces-config.xml方法时.例如.
@FacesValidator("myValidator")
然后被引用为
<f:validator validatorId="myValidator" />
validatorId中的任何EL表达式都将在视图构建时解析为标识验证器ID的String.因此,当传递一个具体的Validator实例时,它只会结束其toString()值,如com.example.MyValidator@hashcode作为验证器ID传递,它毕竟显然不存在,因为异常消息试图告诉您:
javax.faces.FacesException: Expression Error: Named Object: com.example.jsf.validator.LoginValidator@31888ef8 not found.
您应该使用< f:validator binding>或< h:inputText验证器>代替.它可以采取具体的实例.
<f:validator binding="#{myValidator}" />
传递给复合组件时它不起作用是一个不同的问题.您根本没有指定for属性,因此它不会应用于组合内的任何UIInput组件.我认为以下问题/答案将完全适用于解决这个问题:How to specify a validator for an input component inside a composite component?
内容总结
以上是互联网集市为您收集整理的java – 找不到命名对象全部内容,希望文章能够帮你解决java – 找不到命名对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。