Цель недостижима, идентификатор разрешен до нуля - прочитайте все остальные вопросы - PullRequest
0 голосов
/ 22 февраля 2019

Я знаю, что на StackOverflow уже есть много вопросов по этому поводу, но я боролся уже более 5 часов, и я просто не знаю, что делать дальше.Я надеюсь, что когда кто-то увидит мою ситуацию, они могут указать мне правильное направление.Я думаю, что я попробовал каждую комбо аннотаций и не могу заставить его работать.

Я настраиваю приложение Java EE, простое веб-приложение.В настоящее время тестирую мои настройки на простой странице.Связанные файлы ниже.Ошибка возникает при нажатии на кнопку на странице xhtml.

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

reeting.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>

Other:

  • У меня есть пустой beans.xml в WEB-INF (не уверен, если это необходимобольше, начал без и прочитал это пару раз
  • faces-config.xml, у которого нет дочерних элементов в корневом элементе
  • web.xml с отображением сервлета.

Я не хочу загромождать этот вопрос слишком большим количеством информации. Если вам понадобится что-то важное, я с радостью поделюсь.

Заранее спасибо, что подумали со мной.

1 Ответ

0 голосов
/ 22 февраля 2019

Судя по этой проблеме с github: https://github.com/javaserverfaces/mojarra/issues/4264

у вас есть два варианта.

1) Добавить аннотацию FacesConfig к вашим компонентам и явно объявить версию 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, и это, похоже, не работает какописано в выпуске выше.Больше информации о bean-discovery-mode можно найти здесь: 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 является наиболее разумным решением, так как оно содержит проблему.С другой стороны, у вас, вероятно, будет такая же проблема с другими компонентами.

...