【问题标题】:Target Unreachable, identifier resolved to null - read all other questions目标不可达,标识符解析为空 - 阅读所有其他问题
【发布时间】:2019-02-22 09:39:08
【问题描述】:

我知道 StackOverflow 上已经有很多关于此的问题,但我已经挣扎了 5 个多小时,我只是不知道该怎么办了。我希望当有人看到我的情况时,他们可以为我指明正确的方向。我想我已经尝试了每一个注释组合,但我无法让它发挥作用。

我正在设置一个 Java EE 应用程序,简单的网络应用程序。目前在一个简单的页面中测试我的设置。相关文件如下。按下 xhtml 页面上的按钮时出现错误。

javax.el.PropertyNotFoundException: /greeting.xhtml @12,69 action="#{testServlet.createNewUser}": Target Unreachable, identifier 'testServlet' resolved to null

greeting.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Test Page</title>
    </h:head>
    <h:body>
        <h:form>
            <h:commandButton value="Go"
                             action="#{testServlet.createNewUser}"/>
        </h:form>

    </h:body>
</html>

TestServlet.java

package kwetter.admin.test;

import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import kwetter.domain.entities.User;
import kwetter.logic.beans.TestBean;

@Named
@SessionScoped
public class TestServlet implements Serializable {

    @Inject
    private TestBean testBean;

    public TestServlet() {
        System.out.println("TEST CREATED ");
    }

    public String createNewUser() {
        User user = new User();
        testBean.createUser(user);

        return "cool";
    }

}

TestBean.java

package kwetter.logic.beans;

import java.io.Serializable;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import kwetter.database.daos.interfaces.IUserDao;
import kwetter.domain.entities.User;

@Stateless
public class TestBean implements Serializable
{

    @EJB
    private IUserDao userDao;

    public TestBean() {

    }

    public boolean createUser(User user) {
        userDao.save(user);
        return true;
    }
}

IUserDao 声明

public interface IUserDao extends IDao<User>

以及实现:

@Stateless
public class UserDao implements IUserDao

不同模块的依赖关系在 pom 文件中处理。 pom的示例部分:

    <dependency>
        <groupId>com.woutervanacht.kwetter</groupId>
        <artifactId>logic</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>

其他:

  • 我在 WEB-INF 中有一个空的 beans.xml(不确定是否需要它,开始时没有并阅读了几次
  • faces-config.xml 根元素中没有子元素
  • web.xml 带有 servlet 映射。

我不想用太多信息来混淆这个问题。如果您需要任何相关的内容,我会很乐意分享。

提前感谢您与我一起思考。

【问题讨论】:

  • 您是否尝试过stackoverflow.com/questions/30128395/… 中描述的步骤? CDI 托管 bean 的第 1 部分...
  • @nikolairiedel 是的。与我的情况唯一相关的项目符号是 CDI 部分的第三部分(因为我使用的是@Named)。我检查了导入,它是正确的 CDI 之一。

标签: java maven jakarta-ee payara java-ee-8


【解决方案1】:

从这个github issue来看:https://github.com/javaserverfaces/mojarra/issues/4264

你有两个选择。

1) 将 FacesConfig 注释添加到您的 bean 并显式声明 JSF 版本:

@FacesConfig(
    // Activates CDI build-in beans
    version = JSF_2_3
)

这样就可以为你的 TestServlet.java 提供:

package kwetter.admin.test;

import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import kwetter.domain.entities.User;
import kwetter.logic.beans.TestBean;

@FacesConfig(
    // Activates CDI build-in beans
    version = JSF_2_3
)
@Named
@SessionScoped
public class TestServlet implements Serializable {

    @Inject
    private TestBean testBean;

    public TestServlet() {
        System.out.println("TEST CREATED ");
    }

    public String createNewUser() {
        User user = new User();
        testBean.createUser(user);

        return "cool";
    }
}

使用您的空 WEB-INF/beans.xml,您处于 bean-discovery-mode 注释状态,这似乎不像上述问题中描述的那样工作。更多关于 bean-discovery-mode 的信息可以在这里找到:https://blogs.oracle.com/theaquarium/default-cdi-enablement-in-java-ee-7

2) 在 beans.xml 中设置 bean-discover-mode 为 all

所以这会给你

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

我认为 1 是最合理的解决方案,因为它包含了问题。另一方面,您可能会遇到与其他 bean 相同的问题。

【讨论】:

  • 我已经尝试过你的第二种方法,因为我在谷歌上搜索了无数个小时时偶然发现了它。我尝试了您的第一个解决方案,但这似乎也没有任何作用。无论如何,感谢您与我一起思考。
  • 好吧,所以我在从 GitHub 问题复制“有效”的东西时发现了一些东西:问题出在我的 @Inject TestBean testBean; 上。每当我评论说一个简单的getOutput() 函数有效。但是启用它后它就不会被调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2014-11-09
  • 2017-02-11
  • 2014-08-10
  • 1970-01-01
相关资源
最近更新 更多