JSF файл не видит CDI класс и его поля

244
20 октября 2021, 16:20

Всем привет. Стараюсь активно учить Java. Есть совсем небольшой проект, чтобы познакомиться с JSF + CDI. Вот структура проекта

Содержимое файла example.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"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
    <title>#{ExampleBean.title}</title>
</h:head>
<h:body>
     <h:outputText value="#{ExampleBean.text}" />
</h:body>
</html>

Класс из которого хочу получить поля:

package webapp;
import javax.inject.Named;
@Named
public class ExampleBean {
    private String text = "CDI example";
    private String title = "Welcome to the club, Buddy";
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
}

Проблема: При запуске сервера и перехода на веб страничку localhost.../example.xhtml получаю пустую страницу. Понял, что JSF файл не видит класс ExampleBean, но не могу понять почему.

Заранее спасибо.

Answer 1

Потому что сам по себе @Named не делает класс видимым в CDI.
Нужно пометить класс одной из аннотаций для CDI в зависимости от того, какую зону видимости хотите получить для своего класса.
Стандартные аннотации:
@Dependent
@RequestScoped
@ViewScoped (из пакета javax.faces.view)
@ConversationScoped
@SessionScoped
@ApplicationScoped

Не перепутайте с одноименными аннотациями JSF (аннотации cdi импортируются из пакета javax.enterprise.context, JSF из javax.faces.bean)

import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
@Named
@RequestScoped
public class ExampleBean {

В зависимости от настроек в beans.xml аннотация @Dependent может автоматически подразумеваться, если не указана явно никакая другая.

И если Вы не указываете имя явно в @Named, то именем бина будет имя класса с маленькой буквы: #{exampleBean.text}

Answer 2

Проблема была не в отсутствии иных аннотация, помимо @Named. Я ошибся в 2-ух местах: 1) Пытался вызвать bean в example.xhtml, в то время, как писал я имя бина с большой буквы. 2) Скорее всего были забыты подключёны cdi библиотеки. Ответ Сергея навёл меня на мысль о такой проблеме и я добавил в структуру проекта нужные джарники.

Спасибо большое всем за участие и терпение !

READ ALSO
Написание редактора блога для сайта (WYSIWYG)

Написание редактора блога для сайта (WYSIWYG)

Подскажите редактор, который я мог бы добавить себе на сайт для того, чтобы я мог создавать в нем статьиНужен похожий редактор как у StackOverflow...

133
Вопрос по suppressed exceptions в рамках конструкции try-with-resources

Вопрос по suppressed exceptions в рамках конструкции try-with-resources

Вот цитата из книги Oracle-Certified-Professiona-Java-SE-8-Programmer-Exam-1Z0-809

84
Преобразование json

Преобразование json

Как разобрать json такого вида:

209
Как выполнить несколько INSERT с результатом SELECT?

Как выполнить несколько INSERT с результатом SELECT?

Как добавить несколько строк в таблицу если одно из значений будет полученно из SELECT? В запросе все значения не меняются кроме, product_id

155