Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 找不到命名对象_Java_Jsf_Jsf 2_Cdi - Fatal编程技术网

Java 找不到命名对象

Java 找不到命名对象,java,jsf,jsf-2,cdi,Java,Jsf,Jsf 2,Cdi,我创建了一个新的验证器: package com.example.jsf.validator; 导入com.example.components.LoginFormValue; 导入com.example.ejb.SecurityEjb; 导入java.io.Serializable; 导入javax.ejb.ejb; 导入javax.enterprise.context.ApplicationScoped; 导入javax.faces.application.FacesMessage; 导入j

我创建了一个新的验证器:

package com.example.jsf.validator;
导入com.example.components.LoginFormValue;
导入com.example.ejb.SecurityEjb;
导入java.io.Serializable;
导入javax.ejb.ejb;
导入javax.enterprise.context.ApplicationScoped;
导入javax.faces.application.FacesMessage;
导入javax.faces.component.UIComponent;
导入javax.faces.context.FacesContext;
导入javax.faces.validator.validator;
导入javax.faces.validator.ValidatorException;
导入javax.inject.Named;
/**
*{@code login form}组件的验证程序。
*
*@作者史蒂夫
*/
@命名
@适用范围
公共类LoginValidator实现可序列化的验证器
{
@凌驾
公共void验证(FacesContext上下文、UIComponent组件、对象值)引发Validator异常
{
如果(值==null)
{
返回;
}
LoginFormValue LoginFormValue=(LoginFormValue)值;
if(securityEjb.checkCredentials(loginFormValue.getEmailAddress(),loginFormValue.getPassword())){
返回;
}
抛出新的ValidatorException(新面孔消息(“错误的电子邮件地址/密码”);
}
@EJB
私有安全ejb SecurityEjb;
}
但当我尝试使用它时:


我在加载页面时显示此异常:

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类,但却不能实例化它?我的应用程序中的每个其他验证器都是一个名为
的应用程序范围
bean,它们都工作得很好。我使用
引用它们

我使用的是GlassFish 3.1.2。

必须引用验证器的ID,而不是具体的验证器实例。验证程序的ID正是您在使用
faces config.xml
方法时指定为
@FacesValidator
值或
的ID。例如

@FacesValidator("myValidator")
然后将其引用为


validator ID
中的任何EL表达式在视图构建期间都将解析为标识验证器ID的
字符串。因此,当传递具体的
validator
实例时,它只会结束其
toString()
类似
com.example的值。MyValidator@hashcode
作为验证器ID传递,这显然不存在,因为异常消息试图告诉您:

javax.faces.FacesException:表达式错误:命名对象:com.example.jsf.validator。LoginValidator@31888ef8没有找到

您应该改用
。可以举一个具体的例子



当它被传递到复合组件时不工作是另一个问题。您根本没有为
属性指定
,因此它不会应用于组合中的任何
UIInput
组件。我认为以下问题/答案将完全适用于解决该问题:

我今天遇到了相同的问题,并通过添加“ImplementValidator”来解决它。那是我的错误

<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 {

}

@FacesValidator(“com.example.shop.validator.PhoneNumber”)
公共类PhoneNumber实现了验证器{
@凌驾
公共无效验证(FacesContext FacesContext、UIComponent UIComponent、Object o)引发ValidatorException异常{
}

try
已经这样做了。在这种情况下,验证被完全忽略,并且在操作侦听器中提供了不可靠的凭据,此时,该侦听器假定具有指定电子邮件地址的用户提供了有效凭据。尽管我仍然对验证整个复合组件的可能性感兴趣(毕竟,我们可以从中生成一个转换后的值),我在中解决了复合组件验证问题。
validatorId=“#{myBean}”
一直适用于其他非复合组件。您自己试试吧!我想这里的问题是,我正在尝试验证整个表单。我有一个支持组件类,它将表单转换为
LoginFormValue
实例,我希望在这之后调用验证器。它从来没有这样工作过。我只是尝试一下Mojarra 2.1.9上的d,没有雪茄。我完全理解你的例外。如果我知道它是如何工作或为什么工作的,也许你会被
Buggered弄糊涂,但它确实是这样的-至少在Mojarra 2.1.6之前和包括在内。在我的整个应用程序中,它在多个地方为我工作了很长一段时间。我忘记了我的想法是从哪里来的-可能是从某个地方来的。它将是b这个答案(以及所有关于类似问题的答案)告诉我使用
binding
。我的验证器工作时不使用
@FacesValidator
注释。它们只是
@命名的
@ApplicationScoped
并实现
验证器
可序列化的
。这可能是CDI的事情。谁知道呢?我不知道。