将旧版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文章),但仍然无法解决问题。我将非常感谢任何帮助!
答案 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
。