找不到使用@ManagedBean注释的bean

时间:2017-05-23 10:56:23

标签: jsf jsf-2 managed-bean faces-config

将旧版Web应用程序的JSF版本从MyFaces 1.1升级到MyFaces 2.2.12时,我试图直接用<managed-bean>注释替换faces-config.xml文件中的@ManagedBean条目在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中的相应条目覆盖,因此我删除了<managed-bean>中的faces-config.xml元素。

由于项目由多个maven模块组成,这些模块在作为组合war文件部署之前单独打包为jar,我还尝试遵循How does JSF find beans annotated with @ManagedBean?的建议并添加了另一个包含a META-INF的{​​{1}}文件夹faces-config.xml到包含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,如果我理解正确 - 需要在根据{{​​3}},最小servlet规范2.5。

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

1 个答案:

答案 0 :(得分:0)

答案可以在@ManagedBean Javadoc:

中找到
  

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

因此,您的bean名为managed-bean-class而不是myBean。如果您希望它为MyBean,请提供带注释的名称:MyBean