gpt4 book ai didi

java - 目标无法到达,标识符解析为空 - 阅读所有其他问题

转载 作者:行者123 更新时间:2023-11-30 10:06:08 25 4
gpt4 key购买 nike

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

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

javax.el.PropertyNotFoundException:/greeting.xhtml @12,69 action="#{testServlet.createNewUser}": 目标无法到达,标识符 'testServlet' 解析为 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 映射。

我不想用太多信息来扰乱这个问题。如果您需要任何相关信息,我会很乐意与您分享。

预先感谢您与我一起思考。

最佳答案

从这个 github 问题来看: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 相同的问题。

关于java - 目标无法到达,标识符解析为空 - 阅读所有其他问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54824124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com