找不到使用 @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
中的<managed-bean>
元素。
由于该项目由几个 maven 模块组成,这些模块在部署为组合 war 文件之前单独打包为 jar,我还尝试遵循 How does JSF find beans annotated with @ManagedBean? 的建议,并添加了另一个包含 faces-config.xml
的 META-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】:
答案可以在@ManagedBean
Javadoc中找到:
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 如何找到用@ManagedBean 注释的bean?
Java EE 6 @javax.annotation.ManagedBean 与 @javax.inject.Named 与 @javax.faces.ManagedBean