我知道StackOverflow上已经有很多关于这方面的问题,但我现在已经苦苦挣扎了5个多小时,我只是不知道该怎么做了。我希望当有人看到我的情况时,他们可以指出我正确的方向。我想我已经尝试了每一个注释组合,我无法让它工作。
我正在设置一个Java EE应用程序,简单的Web应用程序。目前正在一个简单的页面中测试我的设置相关文件如下。按下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>
test Servlet.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";
}
}
test bean.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>
其他:
beans.xml
(不确定是否需要这个,开始没有,并阅读了几次faces-config.xml
在根元素中没有孩子web.xml
与servlet映射。我不想用太多的信息来混淆这个问题。如果您需要任何相关的内容,我将很乐意与您分享。
提前谢谢你和我一起思考。
从这个github问题来看:https://github.com/javaserverfaces/mojarra/issues/4264
你有两个选择。
1)将FacesConfig Annotation添加到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相同的问题。