Jsf 2 facelets';无法达到的目标';

Jsf 2 facelets';无法达到的目标';,jsf-2,primefaces,facelets,cdi,Jsf 2,Primefaces,Facelets,Cdi,我正在使用maven、JSF2.0、JavaEE6、jpa和glassfish。我有一个初始网页,询问您是否要登录或注册。如果他们说他们想登录,他们会被转发到facelets/primefaces 3,其中会显示一个带有用户名和密码文本框的登录页面。对于用户名文本字段,其值为 value=“#{authenticator.username}” 我得到了一份工作 无法访问目标,标识符“authenticator”解析为空 我使用的是beans.xml。我遵循了CDIBeans的命名约定。 我在Au

我正在使用maven、JSF2.0、JavaEE6、jpa和glassfish。我有一个初始网页,询问您是否要登录或注册。如果他们说他们想登录,他们会被转发到facelets/primefaces 3,其中会显示一个带有用户名和密码文本框的登录页面。对于用户名文本字段,其值为

value=“#{authenticator.username}”

我得到了一份工作

无法访问目标,标识符“authenticator”解析为空

我使用的是beans.xml。我遵循了CDIBeans的命名约定。 我在Authenticator构造函数中插入了一条日志消息,它似乎从未被调用,因为我没有得到消息

另一个奇怪的现象是,每隔一个月它就会起作用,我会得到如下结果:

2012年8月7日00:27:56.140信息…验证器-验证器构造函数中的验证器

07/08/2012 00:27:56.171信息…验证者-获取验证者用户名

2012年8月7日00:27:56.171信息…验证器-验证器构造函数中的验证器

07/08/2012 00:27:56.171信息…验证者-获取验证者密码

2012年8月7日00:27:56.171信息…验证器-验证器构造函数中的验证器

07/08/2012 00:27:56.171信息…验证者-获取验证者用户名

2012年8月7日00:27:56.171信息…验证器-验证器构造函数中的验证器

07/08/2012 00:27:56.171信息…验证者-获取验证者密码

2012年8月7日00:28:05.843信息…验证器-验证器构造函数中的验证器

2012年8月7日00:28:05.843信息…验证器-验证器构造函数中的验证器

2012年8月7日00:28:05.843信息…验证器-验证器构造函数中的验证器

07/08/2012 00:28:05.843信息…验证者-获取验证者用户名

2012年8月7日00:28:05.843信息…验证器-验证器构造函数中的验证器

2012年8月7日00:28:05.906信息…验证器-验证器构造函数中的验证器

07/08/2012 00:28:05.906信息…验证者-获取验证者密码

2012年8月7日00:28:26.000信息…验证器-验证器构造函数中的验证器

2012年8月7日00:28:26.000信息…验证器-验证器构造函数中的验证器`

2012年8月7日00:28:26.000信息…验证器-验证器构造函数中的验证器

2012年8月7日00:28:26.031信息…验证器-验证器构造函数中的验证器 07/08/2012 00:28:26.031信息…验证者-获取验证者密码

当它工作时,我不明白为什么它会多次调用构造函数

下面是托管(cdi)bean:


您正在混合bean管理API。名为的
@来自CDI,但
@ViewScoped
来自JSF。您需要在单个支持bean上使用其中一个,而不是两个。现在bean基本上是由CDI管理的,没有任何有效的作用域,因此每次解析EL表达式
{authenticator}
时都会构造bean

要解决此问题,如果您打算坚持CDI,请使用
@ConversationScoped
而不是
@ViewScoped

@Named
@ConversationScoped
@ManagedBean
@ViewScoped
或者,如果您打算坚持使用JSF,请使用
@ManagedBean
而不是
@Named

@Named
@ConversationScoped
@ManagedBean
@ViewScoped

CDI方法的唯一缺点是,您必须将
@注入
会话
作为属性,然后自己开始和结束它。

您遇到了一点问题,因为您混合了CDI(@Named)和JSF(@ViewScoped)注释。由于这次比赛,它可能被多次调用。您可以查看Seam Faces、MyFaces CODI或滚动您自己版本的ViewScope for CDI,或者放弃CDI直接使用JSF。

我找到了一个解决方案,尽管我不了解它。我在下面的链接中找到了它:!我在faces-config.xml中添加了以下条目,而不仅仅是放置@RequestScoped和@Named

<managed-bean>
   <managed-bean-name>authenticator</managed-bean-name>
   <managed-bean-class>com.mlb.mybills.view.user.Authenticator</managed-bean-class>
   <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

验证者
com.mlb.mybills.view.user.Authenticator
一场
有了这个,我就不再有目标无法到达的错误了


显然,我也纠正了BalusC指出的上述错误。感谢大家。

Post Authenticator managed bean code.+1-但是能够启动/停止对话(通常对应于用例)肯定是一个特性,而不是一个缺点…@jan:我并不是想暗示这本身就是一个缺点,只是在您打算模拟JSF视图范围的特定情况下;使用JSF注释可能更容易。@BalusC谢谢,在使用@ConversationScoped或@RequestScoped和@Named时使用了JSF,但没有使用CDI。我有一个空的beans.xml。我注意到我使用了`字符串result=null;ExternalContext ExternalContext=FacesContext.getCurrentInstance().getExternalContext();HttpServletRequest=(HttpServletRequest)externalContext.getRequest();尝试{request.login(用户名,新字符串(密码));//result=“/private/group.xhtml?faces redirect=true”;result=“/group.xhtml?faces redirect=true”;}`这可能是罪魁祸首。是否有CDI方法获取请求。@BalusC如果我使用FacesContext.getCurrentInstance().getExternalContext(),这可能是我在使用CDINo时获得“无法访问目标”的原因,当然不是。CDI不工作的问题是由托管bean层之上的其他东西引起的,这是因为CODI和Seam 3都劫持了JSF@ViewScope注释并将其转换为CDI范围。