Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 识别和解决javax.el.PropertyNotFoundException:无法访问目标_Jsf_Cdi_El_Managed Bean_Propertynotfoundexception - Fatal编程技术网

Jsf 识别和解决javax.el.PropertyNotFoundException:无法访问目标

Jsf 识别和解决javax.el.PropertyNotFoundException:无法访问目标,jsf,cdi,el,managed-bean,propertynotfoundexception,Jsf,Cdi,El,Managed Bean,Propertynotfoundexception,当尝试引用EL中的托管bean(如so{bean.entity.property})时,有时会抛出javax.EL.PropertyNotFoundException:Target Unreachable异常,通常是在设置bean属性或调用bean操作时 似乎有五种不同的信息: 它们都是什么意思?它们是如何产生的,应该如何解决?1。无法访问目标,标识符“bean”解析为null 这可以归结为,在EL like so{bean}中,托管bean实例本身无法通过标识符托管bean名称找到 确定原因可

当尝试引用EL中的托管bean(如so{bean.entity.property})时,有时会抛出javax.EL.PropertyNotFoundException:Target Unreachable异常,通常是在设置bean属性或调用bean操作时

似乎有五种不同的信息:

它们都是什么意思?它们是如何产生的,应该如何解决?

1。无法访问目标,标识符“bean”解析为null 这可以归结为,在EL like so{bean}中,托管bean实例本身无法通过标识符托管bean名称找到

确定原因可分为三个步骤:

a。谁在管理豆子? B默认的托管bean名称是什么? C支持bean类在哪里

1a。谁在管理豆子? 第一步是检查哪个bean管理框架负责管理bean实例。是CDI via吗?还是JSF通过?还是春天来了?您能确保在同一个支持bean类上没有混合多个bean管理框架特定的注释吗?例如@Named@ManagedBean、@Named@Component或@ManagedBean@Component。这是错误的。bean必须由最多一个bean管理框架管理,并且必须正确配置该框架。如果你已经不知道该选哪一个,那就去看看吧

如果是CDI通过@Named管理bean,那么您需要确保以下几点:

CDI1.0JavaEE6需要一个/WEB-INF/beans.xml文件,以便在战争中启用CDI。它可以是空的,也可以只有以下内容:

没有任何beans.xml或空的beans.xml文件,或使用上述CDI 1.0兼容的beans.xml将与CDI 1.0的行为相同。当存在CDI 1.1兼容的beans.xml且显式版本=1.1时,默认情况下,它将仅使用显式CDI作用域注释(如、等)注册@Named bean。如果您打算将所有bean注册为CDI管理的bean,即使是没有显式CDI作用域的bean,使用以下CDI 1.1兼容的/WEB-INF/beans.xml,并设置bean发现模式=all。默认设置为bean发现模式=annotated

在将CDI 1.1+与bean discovery mode=annotated default一起使用时,请确保没有意外地导入JSF作用域,例如而不是CDI作用域。注意IDE自动完成

当将Mojarra 2.3.0-2.3.2和CDI 1.1+与bean discovery mode=annotated default一起使用时,您需要将Mojarra升级到2.3.3或更高版本,原因是出现了错误。如果您无法升级,那么您需要在beans.xml中设置bean discovery mode=all,或者在WAR中的任意类上放置JSF 2.3特定的@FacesConfig注释,通常是某种应用程序范围的启动类

在Servlet 4.0容器上使用JSF 2.3时,web.xml声明为符合Servlet 4.0,那么您需要在WAR中的任意类上显式地放置JSF 2.3特定的@FacesConfig注释,通常是某种应用程序范围的启动类。这在Servlet3.x中不是必需的

像Tomcat和Jetty这样的非JavaEE容器并不附带CDI。您需要手动安装它。这比仅仅添加库jar要多一些工作。对于Tomcat,请确保遵循此答案中的说明:

您的运行时类路径是干净的,在CDIAPI相关的JAR中没有重复项。确保您没有混合使用多个CDI实现Weld、OpenWebBeans等。确保当目标容器已经打包CDI API时,您不会在webapp中提供另一个CDI甚至Java EE API JAR文件

如果要将用于JSF视图的CDI托管bean打包到JAR中,那么请确保JAR中至少有一个有效的/META-INF/beans.xml,该文件可以保持为空

如果是JSF通过不推荐使用的@ManagedBean管理bean,并且您无法迁移到CDI,那么您需要确保以下几点:

faces-config.xml根声明与JSF 2.0兼容。因此XSD文件和版本必须至少指定JSF2.0或更高版本,而不是1.x

对于JSF2.1,只需将2_0和2.0分别替换为2_1和2.1

如果您使用的是JSF2.2或更高版本,那么请确保在所有地方都使用xmlns.jcp.org名称空间,而不是java.sun.com

对于JSF2.3,只需将2_2和2.2分别替换为2_3和2.3即可

您没有意外地导入而不是导入。注意IDE的自动完成功能,Eclipse会自动将错误的提示作为列表中的第一项

您没有通过faces-config.xml中的JSF 1.x样式的条目在同一个支持bean类上用不同的托管bean名称覆盖@ManagedBean。这个将优先于@ManagedBean。在faces-config.xml中注册托管bean是不必要的,因为JSF2.0,jus 不要把它拿走

您的运行时类路径是干净的,在JSFAPI相关的JAR中没有重复项。确保您没有混合使用多个JSF实现Mojarra和MyFaces。当目标容器已经打包JSFAPI时,确保不要在webapp中提供另一个JSF甚至JavaEEAPIJAR文件。有关JSF安装说明,请参见。如果您打算从WAR升级容器绑定的JSF,而不是在容器中升级,请确保您已指示目标容器使用WAR绑定的JSF API/impl

如果要将JSF托管bean打包到JAR中,那么请确保JAR至少有一个与JSF 2.0兼容的/META-INF/faces-config.xml。另见

如果您实际使用的是jurassic JSF 1.x,并且无法升级,那么您需要通过faces-config.xml而不是@ManagedBean注册bean。不要忘记修复您的项目构建路径,这样您就不再有JSF 2.x库了,这样@ManagedBean注释就不会令人困惑地成功编译

如果是Spring通过@Component管理bean,那么您需要确保以下几点:

正在按照安装和集成弹簧。重要的是,您至少需要在web.xml中包含以下内容:

org.springframework.web.context.ContextLoaderListener 在faces-config.xml中:

1b。默认的托管bean名称是什么? 第二步是检查注册的托管bean名称。JSF和Spring使用约定一致,而CDI根据CDI impl/version有异常

一个FooBean支持的bean类,如下所示

@命名 公共类FooBean{} 根据JavaBeans规范,在所有bean管理框架中,将有一个默认的托管bean名称{fooBean}

一个FOOBean支持的bean类,如下所示

@命名 公共类FOOBean{} 在JSF和Spring中,其非限定类名至少以两个大写字母开头的将有一个默认的托管bean名称,即非限定类名{FOOBean},这也符合JavaBeans规范。在CDI中,2015年6月之前发布的焊接版本也是如此,但2015年6月之后发布的焊接版本2.2.14/2.3.0.B1/3.0.0.A9和OpenWebBeans中均未出现这种情况。在这些焊接版本和所有OWB版本中,它只包含第一个小写字符{fOOBean}

如果您已经像下面那样显式地指定了托管bean名称foo

@Namedfoo 公共类FooBean{} 或者与@ManagedBeanname=foo或@Componentfoo等效,则它将仅由{foo}可用,因此不由{fooBean}可用

1c。支持bean类在哪里? 第三步是双重检查支持bean类是否位于构建和部署的WAR文件中的正确位置。确保已正确执行项目和服务器的完全清理、重建、重新部署和重新启动,以防您实际上正忙于编写代码并不耐烦地在浏览器中按F5。如果仍然无效,让构建系统生成一个WAR文件,然后使用ZIP工具提取和检查该文件。支持bean类的已编译.class文件必须位于其包结构的/WEB-INF/classes中。或者,当它被打包为JAR模块的一部分时,包含编译的.class文件的JAR必须位于/WEB-INF/lib中,因此不能位于EAR的/lib或其他位置

如果您使用的是Eclipse,请确保支持bean类位于src中,因此不是WebContent,并确保启用了Project>Build Automatically。如果您使用的是Maven,请确保支持bean类位于src/main/java中,因此不在src/main/resources或src/main/webapp中

如果您使用EJB+WARs将web应用程序打包为EAR的一部分,那么您需要确保支持bean类在WAR模块中,因此不在EAR模块或EJB模块中。业务层EJB必须没有任何与web层WAR相关的构件,以便业务层可以跨多个不同的web层JSF、JAX-RS、JSP/Servlet等进行重用

2.无法访问目标,“实体”返回空值 这归结为{bean.entity.property}中的嵌套属性实体返回null。这通常仅在JSF需要通过如下输入组件为属性设置值时公开,{bean.entity}实际返回null

您需要确保在@PostConstruct或方法中预先准备好模型实体,或者在使用同一视图上的CRUD列表和/或对话框时,可以使用add action方法

@命名 @视域 公共类Bean{ 私有实体;//+getter setter不是必需的。 @注入 私人实体服务实体服务; @施工后 公共无效初始{ //以防更新现有实体。 entity=entityService.getByIdentityId; //或者,如果您想创建一个新实体。 实体=新实体; } // ... } 作为 强调@PostConstruct的重要性;如果您使用的是使用诸如CDI之类的bean管理框架,那么在常规构造函数中执行此操作将失败。始终使用@PostConstruct钩住托管bean实例初始化,并使用@PreDestroy钩住托管bean实例销毁。此外,在构造函数中,您还无法访问任何注入的依赖项,另请参见

如果entityId是通过提供的,则需要使用而不是@PostConstruct。另见

您还需要确保在回发过程中保留非null模型,以防仅在addaction方法中创建它。最简单的方法是将bean放在视图范围内。另见

3.无法访问目标,“null”返回null 这实际上与2的原因相同,只是所使用的较旧的EL实现在保留要显示在异常消息中的属性名称方面有点缺陷,最终错误地显示为“null”。这只会使调试和修复更加困难,因为您有很多嵌套属性,比如so{bean.entity.subentity.subsubentity.property}

解决方案仍然是一样的:确保所讨论的嵌套实体在所有级别中都不为null

4.无法访问目标,0返回null 这也有与2相同的原因,只有使用的旧EL实现在制定异常消息时有缺陷。仅当在EL中使用大括号表示法[]时,才会出现这种情况,{bean.collection[index]}中的{bean.collection}本身为非null,但指定索引处的项不存在。这样的信息必须解释为:

无法访问目标,“集合[0]”返回空值

解决方案也与第2步相同:确保集合项可用

5.无法访问目标,“BracketSuffix”返回null 这实际上与4的原因相同,只是使用的较旧的EL实现在保留迭代索引以显示在异常消息中时存在一些错误,最终错误地显示为“BracketSuffix”,这实际上是字符]。当集合中有多个项时,这只会使调试和修复更加困难

javax.el.PropertyNotFoundException的其他可能原因:
对于那些仍然陷于困境的人

在CDI中使用NetBeans 8.1和GlassFish 4.1时,出于某种原因,我只在本地出现了这个问题,而不是在远程服务器上。这是什么把戏:

->使用javaee web api 7.0代替NetBeans提供的默认pom版本,即javaee web api 6.0,因此:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
    <type>jar</type>
</dependency>

->将此javaee-web-api-7.0.jar作为lib上载到domain1文件夹中的server lib文件夹中,然后重新启动服务器。

以旧样式使用JSF时,必须在 位于WEB-INF文件夹中的beans-config.xml文件,并在WEB.xml文件中对其进行引用,方法如下:

beans-config.xml

我试过使用其他示波器,但是

web.xml

另一个线索: 我使用的是JSF,并添加了mvn依赖项: com.sun.faces JSFAPI 2.2.11

然后,我尝试更改为Primefaces,并添加Primefaces依赖项:

<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>6.0</version>
</dependency>
我将xhtml从h:更改为p:,添加了xmlns:p=http://primefaces.org/ui 添加到模板。 只有使用JSF,项目才能正常运行,managedbean才能正常运行。当我添加Primefaces时,我得到了无法访问的对象javax.el.propertynotfoundexception。问题是JSF生成的是ManagedBean,而不是Primefaces,我要求Primefaces提供对象。我不得不从.pom中删除jsf impl,清理并安装项目。 从这一点来说一切都很顺利。
希望这能有所帮助。

在我的例子中,我在@NamedbeanName中犯了一个拼写错误,它应该是beanName,但我写了beanNam,例如。

我正在使用wildfly 10作为javaee容器。我遇到了无法到达目标,“实体”返回空值的问题。感谢BalusC的建议,但我的问题不在解释的解决方案中。 意外使用导入com.sun.istack.logging.Logger;而不是导入org.jboss.logging.Logger;导致CDI实现了JSF EL。
希望这有助于改进解决方案

我也有同样的问题。结果证明,解决方案要简单得多。似乎datatable希望该方法采用getter的形式,即getSomeMethod,而不仅仅是someMethod。在我的datatable中,我调用了findResults。我将支持bean中的方法更改为getFindResults,它成功了


commandButton在没有get的情况下运行了find,这只会使它更加混乱。

我决定在自己解决了这个错误后,与大家分享我的发现

首先,应该认真对待BalusC解决方案,但在Netbeans中还有另一个可能需要注意的问题,特别是在使用Maven构建企业应用程序ProjectEAR时

Netbeans生成一个POM父文件、一个EAR项目、一个EJB项目和一个WAR项目 发射型计算机断层扫描仪。 我的项目中的其他一切都很好,我几乎认为问题是GlassFish 4.0中的一个bug,我必须安装它并将其插入Netbeans,因为GlassFish 4.1有一个Weld CDI bug,这使得Netbeans 8.0.2中嵌入的GlassFish 4.1无法使用,除非通过补丁

解决方案:

要解析无法访问的目标,标识符“bean”解析为null 错误-

我在父POM项目上单击鼠标右键,然后选择“属性”。出现“项目属性”对话框,单击“源”,您将惊奇地看到源/二进制格式设置为1.5,编码设置为Windows 1250。 将源代码/二进制格式更改为1.6 0r 1.7,以使项目符合CDI为准,并将编码更改为UTF-8

对所有其他子项目sear、EJB、WAR执行相同的操作,如果它们还不可比较。 运行您的项目,您将不会再次出现该错误


我希望这能帮助有类似错误的人

我决定分享我的解决方案,因为尽管这里提供的许多答案都很有用,但我仍然有这个问题。在我的例子中,我在我的新项目中使用JSF2.3、jdk10、jee8、CDI2.0,我确实在wildfly 12上运行了我的应用程序,启动服务器时使用参数standalone.sh-Dee8.preview.mode=true,正如wildfly网站上推荐的那样。bean解析为null的问题在下载wildfly 13后消失。将完全相同的war上载到wildfly 13使其能够正常工作。

EL按照所述解释${bean.propretyName}-假定您使用显式或隐式方法生成getter/setter,则propertyName将变为getPropertyName

您可以通过将名称显式标识为函数来重写此行为:${bean.methodName}这将直接调用函数方法名,无需修改


您的访问器名为get….并不总是正确的

至于2,在我的例子中,它在更换后神奇地复活了

<body>
贴上

<h:body>

在完成了几个更简单的JSF项目之后,老实说,我不记得现在做了什么不同的设置,我第一次遇到这种错误。我正在做一个非常基本的登录页面用户名,密码,用户Bean。。。像往常一样安排一切。我发现的唯一区别是上面提到的标签。也许有人会觉得这很有用。

我的例子中的问题是我包含了一个接受参数的构造函数,但不是一个带有Inject注释的空构造函数,就像这样

@Inject public VisitorBean() {}
我只是在没有任何构造函数的情况下对它进行了测试,这似乎也能正常工作。

1。主题目标不可访问,标识符“bean”解析为空

我检查了@BalusC和其他共享者的有价值的答案,但我在我的场景中超过了这个问题。
在创建了一个具有不同名称的新xhtml并创建了具有不同名称的bean类之后,我编写了not copy paste代码,并将代码一步一步地粘贴到新的bean类和新的xhtml文件。

我遇到了这个错误,因为在具有@SpringBootApplication的类中,我忘记了指定控制器的包名

这次我想更具体地指出Spring必须扫描哪些组件,而不是配置基本包

就是这样,

@ComponentScanbasePackages={br.com.company.project.repository,br.com.company.project.service}

但正确的形式是其中之一:

@ComponentScanbasePackages={br.com.company.project.repository,br.com.company.project.service,br.com.company.project.controller}

@ComponentScanbasePackages={br.com.company.project


我决定分享我的解决方案,因为尽管正确的答案非常全面,但它并没有涵盖这个愚蠢的错误:

当我从web.xml文件中删除AnnotationConfigWebApplicationContext上下文参数时,这是可行的

如果您有如下所示的like param,则必须将其从web.xml文件中删除

<context-param>
    <param-name>contextClass</param-name>
    <param-value>
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext
  </param-value>
</context-param> 

在我的例子中,el-ri-1.0.jar丢失了。

这也可能是Mojarra 2.3中的一个bug

这与您的运行时类路径相匹配,在CDI API相关的jar中没有重复项。换句话说,您的运行时类路径在某种程度上被重复的库弄乱了。事实上,您的回答帮助我确定了我应该关注的可能问题-在这里证明我的特定解决方案的细节,可能会为几个用户节省时间。我遇到了第3个问题。{bean.entity.property}输出值但失败。我的布尔值有一个setter。在输入字段中使用同一实体上的integer属性时可以工作。有什么想法吗?另一件值得检查的事情是确保JSF和CDI实现集成,这就是我的问题:根据:目标不可访问,标识符“bean”解析为null:在multi-mod中包含ejb、web和ear模块的ule maven项目确保您的web模块声明了对ejb模块的依赖关系。否则,无法使用JSF2.0解析@ManagedBean,您必须在faces config.x中声明它们
我花了大约两个小时才注意到,我没有声明在web模块中包含ejb的依赖关系,我的web模块中只有ejb和webear@bish像@ManagedBean类这样的前端构件首先不属于服务层EJB项目。另请参阅不可序列化的bean是否也会导致此错误,因为我怀疑是这样的,但目前无法亲自尝试。您对问题原因的假设没有意义。PrimeFaces根本不是JSF实现。这符合您的运行时类路径干净且在CDIAPI相关JAR中没有重复项的要求。换句话说,您的运行时类路径在某种程度上被重复的库弄乱了,PrimeFaces只是放大了它,而不是导致它。我发现您的答案很难从总体上理解许多不直接相关的信息,并且源/二进制格式和编码在这个问题中起到了作用。您确定更改此选项不会触发解决问题的良好/完整重建吗?对于使用weblogic的用户,请尝试此链接。对于使用spring和weblogic的用户,请尝试查看此链接。突然间,这件事对我来说破裂了。。。我通过停止服务器、删除javax.faces.jar mojara、删除我的构建目录并清理域中WebLogic服务器的\tmp\和\cache\文件夹、再次启动服务器、尝试发布并因找不到javax而失败,修复了这一问题,SVN恢复javax.faces.jar的删除,这样您就可以将其移出,然后再移入,然后发布。突然,它又开始工作了……始终检查上面几行,查看部署时发生的相关日志消息,这是实际的根本原因:找不到类[Lorg/mxchange/jfinancials/model/receipt/FinancialAdminReceiptSessionBeanRemote;]。加载[cl ass org.mxchange.jfinancials.beans.financial.model.receipt.financial AdminReceiptWebRequestBean]]时出错,无法找到所述bean FinancialAdminReceiptWebRequestBean,并确定为null。另一个常见错误是,在重命名或移动类/接口或忘记清理后不重新启动应用程序服务器。这不是正确的做法,这使得无法在输入组件后面调用正确的设置程序。这也不能成为上述异常的原因。这只会导致上述异常,因为您在操作方法表达式(如action={bean.property})中引用属性而不是action={bean.method}时犯了错误。值得注意的是,在使用函数式编程的现代java世界中,这种正确的做法正在发生变化。请参阅和参考。注意,Lombok有一个fluent设置,其中未添加get/set。我们公司有1000名工程师,他们似乎对当前实践有不同的看法。我认为你和你的1000名工程师把属性和方法混淆了。这种设计实践在具有非常高并发性的大规模应用程序中变得越来越普遍。我想说的是,你的否决票是基于对设计指导原则的一种看法,而不是答案在帮助我们广大社区追踪潜在bug方面的价值。嗯?对不起,我不能忽视这样一种印象:你不知道自己在说什么。能详细解释一下为什么这能解决这个问题吗?或者更确切地说,为什么拥有它会导致问题?通常情况下,你根本不需要它,所以还有其他问题。很可能是脏的运行时类路径。您应该通过添加应该已经由服务器提供的库来解决这个问题,而不是从长远来看使问题变得更糟。
<h:body>
@Inject public VisitorBean() {}
<context-param>
    <param-name>contextClass</param-name>
    <param-value>
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext
  </param-value>
</context-param>