识别和解决 javax.el.PropertyNotFoundException: Target Unreachable

Posted

技术标签:

【中文标题】识别和解决 javax.el.PropertyNotFoundException: Target Unreachable【英文标题】:Identifying and solving javax.el.PropertyNotFoundException: Target Unreachable 【发布时间】:2015-07-19 15:20:22 【问题描述】:

当尝试像#bean.entity.property 那样在 EL 中引用托管 bean 时,有时会抛出 javax.el.PropertyNotFoundException: Target Unreachable 异常,通常是在要设置 bean 属性或要调用 bean 操作时。

似乎有五种不同的消息:

    Target Unreachable, identifier 'bean' resolved to null Target Unreachable, 'entity' returned null Target Unreachable, 'null' returned null Target Unreachable, ''0'' returned null Target Unreachable, 'BracketSuffix' returned null

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

【问题讨论】:

对于那些使用 weblogic 的人,试试这个链接。 https://***.com/questions/45422943/why-is-target-unreachable-identifier-resolved-to-null-on-weblogic/45490295#45490295 对于那些使用 spring 和 weblogic 的人,请尝试查看此链接。 https://***.com/questions/45422943/why-is-target-unreachable-identifier-resolved-to-null-on-weblogic?noredirect=1#comment77843630_45422943 突然间,这对我来说坏了...... 我修复了这个(它无法识别我的 bean),方法是停止服务器,删除 javax.faces.jar (Mojarra ),删除我的构建目录并清除域中我的 WebLogic 服务器的 \tmp\ 和 \cache\ 文件夹,再次启动服务器,尝试发布并使其失败,因为它找不到 javax,SVN 恢复 javax .faces.jar 删除(因此您可以将其移出然后将其移回),然后发布。突然之间,它又起作用了…… 始终检查上面的几行以了解部署时发生的相关日志消息,这是实际的根本原因:Class [ Lorg/mxchange/jfinancials/model/receipt/FinancialAdminReceiptSessionBeanRemote; ] not found. Error while loading [ cl ass org.mxchange.jfinancials.beans.financial.model.receipt.FinancialAdminReceiptWebRequestBean ]]] 并且说 bean (FinancialAdminReceiptWebRequestBean) 无法找到并解决null 当然。另一个常见的错误是,在例如之后不重新启动应用程序服务器。重命名或移动类/接口(或忘记clean)。 【参考方案1】:

1.目标不可达,标识符“bean”解析为空

这归结为托管 bean 实例本身无法通过 EL 中的标识符(托管 bean 名称)找到,例如 #bean

找出原因可以分为三个步骤:

一个。谁在管理 bean? 湾。什么是(默认)托管 bean 名称? C。支持 bean 类在哪里?

1a.谁在管理 bean?

第一步是检查哪个 bean 管理框架负责管理 bean 实例。是通过@Named CDI 吗?还是通过@ManagedBean JSF?还是通过@Component 春天?你能确保你没有在同一个支持 bean 类上混合多个 bean 管理框架特定的注释吗?例如。 @Named @ManagedBean@Named @Component@ManagedBean @Component。这是错误的。 bean 必须由最多一个 bean 管理框架管理,并且该框架必须正确配置。如果您已经不知道该选择哪个,请前往Backing beans (@ManagedBean) or CDI Beans (@Named)? 和Spring JSF integration: how to inject a Spring component/service in JSF managed bean?

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

CDI 1.0 (Java EE 6) 需要 /WEB-INF/beans.xml 文件才能在 WAR 中启用 CDI。它可以是,也可以只有以下内容:

  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
  </beans>

CDI 1.1 (Java EE 7) 没有任何beans.xml,或一个空的beans.xml 文件,或与上述CDI 1.0 兼容的beans.xml 的行为与CDI 1.0 相同。当 CDI 1.1 兼容 beans.xml 带有显式 version="1.1" 时,默认情况下它只会注册 @Named bean with 显式 CDI 范围注释,例如 @RequestScoped@ViewScoped@SessionScoped@ApplicationScoped 等。如果您打算将所有 bean 注册为 CDI 托管 bean,即使是那些没有显式 CDI 范围的 bean,请使用以下 CDI 1.1 兼容 /WEB-INF/beans.xml 并设置 bean-discovery-mode="all"(默认为 @ 987654379@)。

  <?xml version="1.0" encoding="UTF-8"?>
  <beans 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/beans_1_1.xsd"
         version="1.1" bean-discovery-mode="all">
  </beans>

将 CDI 1.1+ 与 bean-discovery-mode="annotated"(默认)一起使用时,请确保您没有意外导入 JSF 范围,例如 javax.faces.bean.RequestScoped,而不是 CDI 范围 javax.enterprise.context.RequestScoped。注意 IDE 自动完成功能。

当使用带有bean-discovery-mode="annotated"(默认)的 Mojarra 2.3.0-2.3.2 和 CDI 1.1+ 时,由于bug,您需要将 Mojarra 升级到 2.3.3 或更高版本。如果无法升级,则需要在beans.xml 中设置bean-discovery-mode="all",或者将JSF 2.3 特定的@FacesConfig 注释放在WAR 中的任意类上(通常是某种应用程序范围的启动类)。

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

使用 CDI 3.0 时,第一个版本的包从 javax.* 重命名为 jakarta.*,那么您需要确保所有部署描述符文件 beans.xmlweb.xmlfaces-config.xml 符合 the new jakartaee schemas 和因此不符合旧的javaee 方案。

  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee 
                             https://jakarta.ee/xml/ns/jakartaee/beans_3_0.xsd"
         version="3.0" bean-discovery-mode="all">
  </beans>

Tomcat 和 Jetty 等非 JEE 容器不附带 CDI。您需要手动安装它。这比仅添加库 JAR 需要更多的工作。对于 Tomcat,请确保遵循此答案中的说明:How to install and use CDI on Tomcat?

您的运行时类路径是干净的,并且在与 CDI API 相关的 JAR 中没有重复项。确保您没有混合多个 CDI 实现(Weld、OpenWebBeans 等)。当目标容器已经捆绑了 CDI API 时,请确保不要在 webapp 中提供另一个 CDI 甚至 Java EE API JAR 文件。

如果您在 JAR 中为 JSF 视图打包 CDI 托管 bean,请确保 JAR 至少有一个有效的 /META-INF/beans.xml(可以保留为空)。


如果是 JSF 通过自 2.3 起已弃用的 @ManagedBean 管理 bean,并且您无法迁移到 CDI,那么您需要确保以下几点:

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

  <faces-config
      xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
      version="2.0">

对于 JSF 2.1,只需将 2_02.0 分别替换为 2_12.1

如果您使用的是 JSF 2.2 或更高版本,请确保您使用的是 xmlns.jcp.org 命名空间而不是 java.sun.com

  <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">

对于 JSF 2.3,只需将 2_22.2 分别替换为 2_32.3

您没有意外导入javax.annotation.ManagedBean 而不是javax.faces.bean.ManagedBean。注意 IDE 自动完成功能,众所周知,Eclipse 会自动提示错误的选项作为列表中的第一项。

您没有通过 JSF 1.x 样式的 &lt;managed-bean&gt; 条目覆盖同一支持 bean 类上的 faces-config.xml 条目以及不同的托管 bean 名称。这个优先于@ManagedBean。从 JSF 2.0 开始,不需要在 faces-config.xml 中注册托管 bean,只需将其删除即可。

您的运行时类路径是干净的,并且在与 JSF API 相关的 JAR 中没有重复项。确保您没有混合多个 JSF 实现(Mojarra 和 MyFaces)。当目标容器已经捆绑了 JSF API 时,请确保不要在 webapp 中提供另一个 JSF 甚至 Java EE API JAR 文件。有关 JSF 安装说明,另请参阅 "Installing JSF" section of our JSF wiki page。如果您打算从 WAR 而非容器本身升级容器捆绑的 JSF,请确保您已指示目标容器使用 WAR 捆绑的 JSF API/impl。

如果您将 JSF 托管 bean 打包到 JAR 中,请确保 JAR 至少具有与 JSF 2.0 兼容的/META-INF/faces-config.xml。另见How to reference JSF managed beans which are provided in a JAR file?

如果您实际上使用的是侏罗纪 JSF 1.x,并且无法升级,那么您需要通过 &lt;managed-bean&gt;faces-config.xml 中注册 bean 而不是 @ManagedBean .不要忘记修复您的项目构建路径,使您不再拥有 JSF 2.x 库(这样@ManagedBean 注释就不会成功编译)。


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

正在按照its documentation 安装和集成 Spring。重要的是,您至少需要在web.xml 中拥有这个:

  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

这个在faces-config.xml:

  <application>
      <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
  </application>

(以上是我对 Spring 的所有了解——我不使用 Spring——随意编辑/评论其他可能与 Spring 相关的原因;例如一些与 XML 配置相关的问题)


如果中继器组件通过其var 属性(例如&lt;h:dataTable var="item"&gt;&lt;ui:repeat var="item"&gt;&lt;p:tabView var="item"&gt; 等)管理(嵌套)bean,而您实际上得到了一个“Target Unreachable, identifier 'item' resolve to null”,那么你需要确保以下几点:

#item 未在任何子组件的 binding 属性中引用。这是不正确的,因为 binding 属性在视图构建期间运行,而不是在视图渲染期间运行。此外,在组件树中实际上只有一个组件在每一轮迭代中都可以简单地重用。换句话说,您实际上应该使用binding="#bean.component" 而不是binding="#item.component"。但更好的是完全摆脱组件绑定到 bean 并调查/询问您认为以这种方式解决的问题的正确方法。另见How does the 'binding' attribute work in JSF? When and how should it be used?


1b.什么是(默认)托管 bean 名称?

第二步是检查注册的托管 bean 名称。 JSF 和 Spring 使用约定符合 JavaBeans specification,而 CDI 有例外,具体取决于 CDI impl/version。

如下所示的FooBean 支持 bean 类,

  @Named
  public class FooBean 

根据 JavaBeans 规范,所有 bean 管理框架都会有一个默认的托管 bean 名称 #fooBean

如下所示的FOOBean 支持 bean 类,

  @Named
  public class FOOBean 

在 JSF 和 Spring 中,其非限定类名以至少两个大写字母开头的默认托管 bean 名称与非限定类名 #FOOBean 完全相同,也符合 JavaBeans 规范。在 CDI 中,2015 年 6 月之前发布的 Weld 版本也是如此,但 2015 年 6 月之后发布的 Weld 版本 (2.2.14/2.3.0.B1/3.0.0.A9) 和 OpenWebBeans 中都不是这种情况,因为an oversight in CDI spec .在这些 Weld 版本和所有 OWB 版本中,只有第一个字符小写 #fOOBean

如果您已显式指定托管 bean 名称 foo,如下所示,

  @Named("foo")
  public class FooBean 

或与@ManagedBean(name="foo")@Component("foo") 等效,则它只能由#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/resourcessrc/main/webapp 中。

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


2.目标不可达,“实体”返回 null

这归结为#bean.entity.property 中的嵌套 属性#bean.entity.property 返回null。这通常仅在 JSF 需要通过如下所示的输入组件设置property 的值时公开,而#bean.entity 实际上返回null

<h:inputText value="#bean.entity.property" />

您需要确保事先在@PostConstruct&lt;f:viewAction&gt; 方法或add() 操作方法中准备好模型实体,以防您正在使用 CRUD 列表和/或对话框相同的观点。

@Named
@ViewScoped
public class Bean 

    private Entity entity; // +getter (setter is not necessary).

    @Inject
    private EntityService entityService;

    @PostConstruct
    public void init() 
        // In case you're updating an existing entity.
        entity = entityService.getById(entityId);

        // Or in case you want to create a new entity.
        entity = new Entity();
    

    // ...

关于@PostConstruct的重要性;如果您使用的是使用proxies 的bean 管理框架,例如CDI,那么在常规构造函数中执行此操作会失败。始终使用@PostConstruct 挂钩托管bean 实例初始化(并使用@PreDestroy 挂钩托管bean 实例销毁)。此外,在构造函数中,您还无法访问任何注入的依赖项,另请参阅 NullPointerException while trying to access @Inject bean in constructor。

如果entityId 是通过&lt;f:viewParam&gt; 提供的,您需要使用&lt;f:viewAction&gt; 而不是@PostConstruct。另见When to use f:viewAction / preRenderView versus PostConstruct?

您还需要确保在回发期间保留非null 模型,以防您仅在add() 操作方法中创建它。最简单的方法是将 bean 放在视图范围内。另见How to choose the right bean scope?


3.目标不可达,'null' 返回 null

这实际上与 #2 的原因相同,只是使用的(较旧的)EL 实现在保留要在异常消息中显示的属性名称方面有些错误,最终错误地暴露为“null”。当你有很多嵌套属性时,这只会让调试和修复变得更加困难,比如#bean.entity.subentity.subsubentity.property

解决方法还是一样的:确保有问题的嵌套实体不是null,在所有级别中。


4.目标不可达,''0'' 返回 null

这也与 #2 的原因相同,只是使用的(较旧的)EL 实现在制定异常消息时存在错误。仅当您在 EL 中使用大括号符号 [] 时,这才会暴露,就像在 #bean.collection[index] 中一样,其中 #bean.collection 本身不为空,但指定索引处的项目不存在。然后必须将这样的消息解释为:

目标不可达,'collection[0]' 返回 null

解决方法也同#2:确保收藏项可用。


5.目标不可达,'BracketSuffix' 返回 null

这实际上与 #4 的原因相同,只是使用的(较旧的)EL 实现在保留迭代索引以显示在异常消息中有些错误,最终错误地暴露为“BracketSuffix”,这实际上是字符]。当集合中有多个项目时,这只会使调试和修复变得更加困难。


javax.el.PropertyNotFoundException 的其他可能原因:

javax.el.ELException: Error reading 'foo' on type com.example.Bean javax.el.ELException: Could not find property actionMethod in class com.example.Bean javax.el.PropertyNotFoundException: Property 'foo' not found on type com.example.Bean javax.el.PropertyNotFoundException: Property 'foo' not readable on type java.lang.Boolean javax.el.PropertyNotFoundException: Property not found on type org.hibernate.collection.internal.PersistentSet Outcommented Facelets code still invokes EL expressions like #bean.action() and causes javax.el.PropertyNotFoundException on #bean.action

【讨论】:

我遇到了数字 3。#bean.entity.property 确实输出了该值,但 &lt;p:selectBooleanCheckbox value="#bean.entity.property"/&gt; 失败了。我的布尔值确实有一个二传手。同一实体上的整数属性确实在输入字段中使用时起作用。有什么想法吗? 另一件值得检查的事情是确保您的 JSF 和 CDI 实现集成,这是我的问题:***.com/questions/44064995/… 根据:Target Unreachable, identifier 'bean' resolved to null:在多模块 maven 项目(包含 ejb、web、ear 的模块)中,确保您的 web 模块声明对您的 ejb 模块的依赖。否则,@ManagedBean 无法使用 JSF2.0 解决,您必须在 faces-config.xml 中声明它们。我花了大约两个小时才注意到我没有声明一个依赖项来在我的 web 模块中包含 ejb(我的耳朵里只有 ejb 和 web) @bish 像@ManagedBean 类这样的前端工件首先不属于服务层(EJB 项目)。另见***.com/questions/13011392/jsf-service-layer 无法序列化的 bean 是否也会导致此错误(我怀疑***.com/questions/47533584/… 的情况是这样(但目前无法自己尝试))【参考方案2】:

对于那些仍然被困的人......

使用带有 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 文件夹中的 lib 文件夹)并重新启动服务器。

【讨论】:

这匹配 “你的运行时类路径是干净的,并且在 CDI API 相关的 JAR 中没有重复。” 换句话说,你的运行时类路径在某种程度上被重复的库弄乱了. 确实,您的回答帮助我确定了我应该关注的可能问题;-) 只需在此处提供我的具体解决方案的详细信息,它可能会为几个用户节省时间。【参考方案3】:

以旧样式使用 JSF 您必须在 beans-config.xml 文件(位于 WEB-INF 文件夹中)并在 web.xml 文件中引用它,这样:

beans-config.xml

<managed-bean>
  <managed-bean-name>"the name by wich your backing bean will be referenced"</managed-bean-name>
  <managed-bean-class>"your backing bean fully qualified class name"</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>    
</managed-bean>

(我尝试过使用其他范围,但是...)

web.xml

<context-param>
  <param-name>javax.faces.CONFIG_FILES</param-name>
  <param-value>"/WEB-INF/beans-config.xml</param-value>
</context-param>

【讨论】:

【参考方案4】:

另一个线索: 我正在使用 JSF,并添加了 mvn 依赖项: com.sun.faces jsf-api 2.2.11

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.2.11</version>
    </dependency>

然后,我尝试改成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,proyect 才能正常运行,并且可以正常访问 managedbean。当我添加 Primefaces 时,我得到了无法访问的对象(javax.el.propertynotfoundexception)。问题是 JSF 正在生成 ManagedBean,而不是 Primefaces,而我正在为该对象询问 primefaces。我不得不从我的 .pom 中删除 jsf-impl,清理并安装项目。 从这一点开始一切顺利。 希望对您有所帮助。

【讨论】:

您对问题原因的假设没有意义。 PrimeFaces 根本不是 JSF 实现。这符合要求“您的运行时类路径是干净的,并且在 CDI API 相关的 JAR 中没有重复。” 换句话说,您的运行时类路径在某种程度上被重复的库弄乱了,而 PrimeFaces 只是放大了它,而不是造成它。【参考方案5】:

在我的例子中,我在@Named("beanName") 中犯了一个拼写错误,它应该是“beanName”,但我写了“beanNam”,例如。

【讨论】:

【参考方案6】:

我将 wildfly 10 用于 javaee 容器。我遇到了“目标无法访问,'实体'返回 null”的问题。感谢 BalusC 的建议,但解决方案中的我的问题得到了解释。 不小心使用了“import com.sun.istack.logging.Logger;”而不是“导入 org.jboss.logging.Logger;”导致 CDI 实施 JSF EL。 希望它有助于改进解决方案。

【讨论】:

【参考方案7】:

我遇到了同样的问题。结果证明解决方案要简单得多。似乎数据表需要getter 形式的方法,即getSomeMethod(),而不仅仅是someMethod()。在我的数据表中,我调用的是 findResults。我将支持 bean 中的方法更改为 getFindResults() 并且它有效。

一个 commandButton 在没有 get 的情况下工作查找,这只会使其更加混乱。

【讨论】:

【参考方案8】:

我决定在自己解决此错误后分享我的发现。

首先,应认真对待 BalusC 解决方案,但 Netbeans 中还有一个可能需要注意的问题,尤其是在使用 Maven 构建 Enterprise Application Project(EAR) 时。

Netbeans 生成一个父 POM 文件、一个EAR 项目、一个EJB 项目 和一个WAR 项目 . 我项目中的其他一切都很好,我几乎认为问题可能是 GlassFish 4.0 中的一个错误(我必须安装并将其插入 Netbeans),因为 GlassFish 4.1 有一个 Weld CDI 错误,这使得 Netbeans 8.0 中嵌入了 GlassFish 4.1。 2 无法使用,除非通过补丁。

解决方案:

解决“Target Unreachable, identifier 'bean' resolve to null” 错误-

我右键单击父 POM 项目,然后选择 属性。出现项目属性对话框,单击“Sources”,您会惊讶地看到“Source/Binary Format”设置为 1.5,“Encoding”设置为 Windows 1250。 将“Source/Binary Format”更改为 1.6 0r 1.7,以使您的项目符合 CDI 标准,并将“Encoding”更改为 UTF-8。

如果所有其他子项目(EAR、EJB、WAR)尚不兼容,请执行相同操作。 运行您的项目,您将不会再收到该错误。

我希望这可以帮助有类似错误的人。

【讨论】:

我发现您的答案通常难以理解(对于很多不直接相关的信息),并且源/二进制格式和编码在这个问题中发挥作用。您确定更改此设置不仅会触发解决问题的良好/完整重建吗?【参考方案9】:

我决定分享我的解决方案,因为尽管此处提供的许多答案很有帮助,但我仍然遇到了这个问题。就我而言,我在我的新项目中使用 JSF 2.3、jdk10、jee8、cdi 2.0,并且我确实在 Wildfly 12 上运行了我的应用程序,使用参数 Standalone.sh -Dee8.preview.mode=true 启动服务器,正如 Wildfly 网站上所推荐的那样.下载wildfly 13后“bean解析为null”的问题消失了。将完全相同的war上传到wildfly 13就可以了。

【讨论】:

【参考方案10】:

EL 解释 $bean.propretyName 描述 - 假设您使用显式或隐式方法生成 getter/setter,propertyName 变为 getPropertyName()

您可以通过将名称显式标识为函数来覆盖此行为: $bean.methodName() 这会直接调用函数方法 Name() 而无需修改。

您的访问器被命名为“get...”并不总是正确的。

【讨论】:

这不是正确的做法,这使得无法在输入组件后面调用正确的设置器。这也不能是上述异常的原因。这只会导致您错误地引用动作方法表达式中的属性,例如action="#bean.property"而不是action="#bean.method" 值得注意的是,在具有函数式编程的现代 Java 世界中,这种“正确做法”正在发生变化。请参阅dev.to/scottshipp/… 和其中的参考资料。请注意,Lombok 有一个“流利”设置,其中不添加 get/set。我们公司有 1000 名工程师,他们似乎对当前的做法有不同的看法。 我认为您和您的 1000 名工程师将属性与方法混淆了。 这种设计实践在具有极高并发性的大规模应用程序中变得普遍。我建议您的反对意见是基于设计指南的一种观点,而不是答案在帮助我们广大社区追踪潜在错误方面的价值。 嗯?抱歉,我不能忽视您不知道自己在说什么的印象。【参考方案11】:

至于#2,在我的情况下,它在替换后神奇地复活了

<body>

标记
<h:body>

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

【讨论】:

【参考方案12】:

我的问题是我包含了一个带参数的构造函数,而不是一个带有 Inject 注释的空构造函数,就像这样。

@Inject public VisitorBean() 

我只是在没有任何构造函数的情况下对其进行了测试,这似乎也可以工作。

【讨论】:

【参考方案13】:

对于1.主题(Target Unreachable,标识符'bean'解析为null);

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

【讨论】:

【参考方案14】:

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

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

原来是这样的:

@ComponentScan(basePackages = "br.com.company.project.repository", "br.com.company.project.service")

但正确的形式是以下之一:

@ComponentScan(basePackages = "br.com.company.project.repository", "br.com.company.project.service", "br.com.company.project.controller")

@ComponentScan(basePackages = "br.com.company.project")

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

【讨论】:

【参考方案15】:

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

如果你有如下所示的类似参数,你必须从 web.xml 文件中删除它

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

【讨论】:

想详细说明为什么会解决这个问题?或者更确切地说,为什么它会导致问题?【参考方案16】:

在我的情况下,“el-ri-1.0.jar”丢失了。

【讨论】:

通常你根本不需要它,所以还有别的问题。很可能是一个肮脏的运行时类路径。您应该通过添加本应由服务器提供的库来解决这个问题,而不是长期让它变得更糟。【参考方案17】:

这也可能是 Mojarra 2.3 https://github.com/eclipse-ee4j/mojarra/issues/4734 中的一个错误

【讨论】:

【参考方案18】:

首先,我使用的是:Eclipse、Weblogic、CDI、JSF、PrimeFaces。如果你也是,也许我的解决方案可以帮助你。

在我的情况下,错误的原因是“Eclipse”上的一个小设置。

检查一下:

    右键单击“服务器”选项卡上的 Weblogic 服务器 选择“属性” 在新的属性小窗口中,展开“Weblogic”菜单 在“Weblogic”菜单中,单击“发布”选项 现在,确保在右侧选中“发布为展开的存档”选项。

在我的例子中,我检查了“作为虚拟应用程序发布”,因此,更改它我解决了“目标无法访问”错误。

【讨论】:

以上是关于识别和解决 javax.el.PropertyNotFoundException: Target Unreachable的主要内容,如果未能解决你的问题,请参考以下文章

供应虚拟机没有usb端口和无法识别映射usb解决方案

指纹识别基于模板匹配算法解决指纹识别问题matlab源码

在表单识别器中实现反馈循环和追溯的解决方法

为啥我的支持 unicode 的软件无法识别 ANSI 文件中的“Š”和其他字符?如何解决?

人脸识别考勤系统解决方案

js识别安卓和ios及pc端,以及解决微信的屏蔽