找不到使用 @ManagedBean 注释的 bean

Posted

技术标签:

【中文标题】找不到使用 @ManagedBean 注释的 bean【英文标题】:Can't find beans annotated with @ManagedBean 【发布时间】:2017-10-23 06:59:18 【问题描述】:

在将旧 Web 应用程序的 JSF 版本从 MyFaces 1.1 升级到 MyFaces 2.2.12 时,我试图直接在 bean 类中用 @ManagedBean 注释替换我的 faces-config.xml 文件中的 <managed-bean> 条目。我使用Migrating from JSF 1.2 to JSF 2.0 作为迁移的一般指南。

例如,我正在替换类似

<managed-bean>
    <managed-bean-name>MyBean</managed-bean-name>
    <managed-bean-class>some.package.MyBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class MyBean 

根据Are there going to be two instances for a bean if I write @managed bean annotation and define same in faces-config.xml,注释被faces-config.xml中的对应条目覆盖,所以我删除了faces-config.xml中的&lt;managed-bean&gt;元素。

由于该项目由几个 maven 模块组成,这些模块在部署为组合 war 文件之前单独打包为 jar,我还尝试遵循 How does JSF find beans annotated with @ManagedBean? 的建议,并添加了另一个包含 faces-config.xmlMETA-INF 文件夹到包含 bean 的子模块,位于以下位置(尊重How to reference JSF managed beans which are provided in a JAR file? 中接受的答案):

MainProject
|  SubModule
|     |src
|       | main
|          | resources
|             | META-INF
|                | faces-config.xml

内容如下:

<faces-config
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
        version="2.2">
</faces-config>

遗憾的是,在尝试打开使用此特定 bean 的页面时,我仍然收到以下错误:

javax.el.PropertyNotFoundException: Target Unreachable, identifier 'MyBean' resolved to null

由于我使用 JSF 进行 bean 管理,因此我遵循了 Identifying and solving javax.el.PropertyNotFoundException: Target Unreachable 中说明的 JSF 部分,但即使在验证了其中提到的各个点之后,我仍然遇到相同的错误。

我正在使用 Tomcat 7 作为 servlet 容器,根据 http://tomcat.apache.org/whichversion.html,它支持最高版本 3.0 的 servlet 规范,反过来,对于 JSF 2.2 来说应该足够了,如果我理解正确的话,它至少需要 servlet规范 2.5,根据http://myfaces.apache.org/core22/。

我已经搜索了很多问题的原因(如前所述,我尝试了上面提到的几篇SO文章),但仍然无法解决问题。如果有任何帮助,我将不胜感激!

【问题讨论】:

小建议:在 JSF 2.3 中,@ManagedBean 注释已被弃用,取而代之的是使用 CDI @Named。现在不是直接切换到 @ManagedBean 的合适时机吗? @Kukeltje 感谢您的建议。我考虑升级到 CDI 和 @Named 注释,但遇到了许多其他问题。但也许你是对的,我应该尝试解决这些问题,而不是让一些很快就会被弃用的工作。 【参考方案1】:

答案可以在@ManagedBeanJavadoc中找到:

ManagedBean.name 属性的值被视为managed-bean-name。如果 name 属性的值未指定或者是空的String,则managed-bean-name 是通过获取完全限定类名的非限定类名部分并将第一个字符转换为小写而派生的。例如,如果ManagedBean 注释在具有完全限定类名称com.foo.Bean 的类上,并且注释上没有名称属性,则managed-bean-name 被视为bean。附加此注释的类的完全限定类名被视为managed-bean-class

所以你的 bean 被命名为 myBean 而不是 MyBean。如果您希望它是 MyBean,请提供带有注释的名称:@ManagedBean(name = "MyBean")

【讨论】:

非常感谢您的回答!不幸的是,我已经尝试通过使用(name = "MyBean") 设置名称来解决问题(然后再次尝试),但我仍然遇到同样的错误:javax.el.PropertyNotFoundException: Target Unreachable, identifier 'MyBean' resolved to null 我快疯了。我尝试将 META-INF 文件夹和包含的 faces-config.xml 放入每个可以想象的位置,但错误仍然存​​在。

以上是关于找不到使用 @ManagedBean 注释的 bean的主要内容,如果未能解决你的问题,请参考以下文章

JSF-2.3 找不到我的 @Named CDI-1.2 托管 bean

JSF2.0 Tomcat7中@Named和@ManagedBean注解的区别[重复]

在 jsf 中的类型上找不到属性

JSF 如何找到用@ManagedBean 注释的bean?

Java EE 6 @javax.annotation.ManagedBean 与 @javax.inject.Named 与 @javax.faces.ManagedBean

找不到Joomla文件错误