Цель недостижима, идентификатор разрешен до нуля - прочитайте все остальные вопросы
Я знаю, что на Stackru уже есть много вопросов об этом, но я боролся уже более 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. Пример части пом:
<dependency>
<groupId>com.woutervanacht.kwetter</groupId>
<artifactId>logic</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
Другой:
- У меня пустой
beans.xml
в WEB-INF (не уверен, если это нужно больше, начал без и прочитал его пару раз faces-config.xml
который не имеет дочерних элементов в корневом элементеweb.xml
с отображением сервлетов.
Я не хочу загромождать этот вопрос слишком большим количеством информации. Если вам нужно что-то актуальное, я с удовольствием поделюсь.
Заранее спасибо, что подумал со мной.
1 ответ
Судя по этой проблеме 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-компонентов можно найти здесь: https://blogs.oracle.com/theaquarium/default-cdi-enablement-in-java-ee-7.
2) Установите bean-Discover-mode для всех в beans.xml
Так что это даст вам
<?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 является наиболее разумным решением, так как оно содержит проблему. С другой стороны, у вас, вероятно, будет такая же проблема с другими бобами.