@ManagedProperty未注入

3

@ManagedProperty("#{sessionBean}") 没有被正确注入。 sessionBean 在一个 JAR 文件中声明,并且它具有与 JSF 2.0 兼容的 faces-config。 但是,当我使用

FacesContext context = FacesContext.getCurrentInstance();
sessionBean = (SessionBean) context.getApplication().evaluateExpressionGet(context, "#{sessionBean}", SessionBean.class);

它正确地评估了会话Bean。这是为什么呢?
编辑:我想注入的Bean(sessionBean)在一个JAR文件中,该文件被注释为@ManagedBean和@SessionScoped。此外,该JAR包含一个JSF2兼容的faces-config,在META-INF/resources中。

2
你知道JSF使用setter依赖注入来解析托管属性吗?你有一个setSessionBean(SessionBean sb)方法吗?如果没有 - 那就是一个解决方案。如果有 - 请提供更广泛的上下文。无论如何,你必须以开发者友好的方式描述“未注入”。 - skuntsel
是的,setter已经就位。除了问题本身中所解释的内容之外,我不知道更广泛的上下文是什么。无论如何,我编辑了问题,使其更加广泛。 - SashikaXP
我遇到了这个问题描述中所述的问题。我在SessionBean setter中放置了日志记录,但根本没有被调用。我正在按照这些说明操作:http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#InjectingManagedBeansInEachOther。我在Tomcat 7.0.50上使用Mojarra 2.2.5。如有需要,我很乐意提供更多细节。 - daveloyall
我正在使用javax.faces.bean.*注释,而不是javax.annotation.*。 - daveloyall
2个回答

1

1.) 你把 sessionBean 注入到哪里了?展示一下类定义。这个类是 @ManagedBean 吗?

2.) 检查是否调用了 setter 方法 setSessionBean(SessionBean sb)

3.) 在 setter 方法提供的值是 null 吗?

4.) 你也可以尝试以下操作:

@PostConstruct
private void init() {
  FacesContext context = FacesContext.getCurrentInstance();
  sessionBean = (SessionBean) context.getApplication().evaluateExpressionGet(context, "#{sessionBean}", SessionBean.class);
}

...并检查sessionBean是否正确评估。


1

对我来说,这是一个与包相关的问题,以下导入适用于我:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

之前我使用了不同的包(由IDE自动导入)的组合:

import javax.faces.bean.ManagedProperty;
import javax.faces.view.ViewScoped;
import javax.inject.Named;

1
确实,javax.faces.view.ViewScoped 无法用于检索 @ManagedProperty("#{param.id}"),您必须使用 javax.faces.bean.ViewScoped。你做得很好! - s_bighead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接