Пустой экземпляр после внедрения компонента CDI @SessionScoped в JSF @ManagedBean - PullRequest
0 голосов
/ 09 января 2019

у меня есть: - Репозиторий Класс:

@SessionScoped
public class EmployeeRepository {
    @PersistenceContext
    EntityManager entityManager;
    public List<Employee> getEmployees(){
        TypedQuery<Employee> qu = entityManager.createQuery("select * from Employee", Employee.class);
        List<Employee> emp2 = qu.getResultList();
        return emp2;
    }
}

и

Управляемый Боб:

@ManagedBean(name = "helloWorldBean")
public class HelloWorldBean {
    @Inject
    private EmployeeRepository employeerepo;
    public String getMsg() {
        return "Hallo";
    }
    public String getEmployees() {
        return String.valueOf(employeerepo.getEmployees().size());
    }
}

и страница JSF:

<h:head>
    <title>JavaCodeGeeks</title>
</h:head>
<h:body>
    - Message : <h:outputText value="#{helloWorldBean.msg}" />
    - Employee count : <h:outputText value="#{helloWorldBean.employees}" />
</h:body>
</html>

У меня есть beans.xml в моей папке META-INF (src \ META-INF) без специальных настроек:

<?xml version="1.0"?>
<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"
  bean-discovery-mode="all" version="1.1">
</beans>

Проблема:

Страница генерирует исключение nullpointer, потому что EmployeeRepository не внедряется в HelloWorldBean.

Что нужно сделать, чтобы иметь возможность вводить экземпляры классов в моем случае?

1 Ответ

0 голосов
/ 09 января 2019

Поскольку вы используете CDI, вы не должны использовать @ManagedBean (это аннотация JSF). Хотя я на самом деле видел, как это работает, большинство реализаций не позволяют вам вводить компонент CDI в классический компонент JSF.

Чтобы разрешить внедрение CDI в bean-компонентах JSF, спецификация CDI позволяет определять базовые bean-компоненты JSF путем указания аннотации @Named в сочетании с областью действия (@RequestScoped, @javax.faces.view.ViewScoped, @SessionScoped и @ApplicationScoped ).

Итак, вкратце, следующий фрагмент кода должен решить вашу проблему,

@Named
@RequestScoped
public class HelloWorldBean {
    @Inject
    private EmployeeRepository employeerepo;
    public String getMsg() {
        return "Hallo";
    }

    public String getEmployees() {
        return String.valueOf(employeerepo.getEmployees().size());
    }
}

Вы также можете прочитать дальше по этой теме через некоторые старые вопросы и ответы здесь на сайте,

Как внедрить компонент CDI в ManagedBean?

@ ManagedProperty не работает в управляемом компоненте CDI

Инъекция бобов CDI

...