С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
52 / 18 / 11
Регистрация: 27.03.2013
Сообщений: 789

Использование @Inject не помогает контейнеру сервлетов Tomcat управлять beans

25.12.2018, 17:37. Показов 1896. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Использование @Inject должна указывать компилятору, что управление beans передается контейнеру сервлетов.
Например указав данную аннотацию, над полем класса, объект указанного типа должен быть создан автоматически.

Но при указании этой аннотации, объект не создается.

Просматривал пример, который рассказывает про CDI И там все волшебно работает.


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
 
@WebServlet("/cdi")
public class DependencyInjectionExample extends HttpServlet{
 
    @Inject
    Student student;
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        output();
        System.out.println("Вызов сервлета!!!");
    }
 
 
    public void output(){
        student.setName("иван");
 
        System.out.println(" --- Имя студента - " + student.getName());
    }
}
 
/* Java-beans - пример
@RequestScoped - означает, что создаваемый внедренный
бин имеет жизненный цикл, только во время текущего запроса*/
@RequestScoped
class Student {
 
    private String name;
 
 
    public Student() {
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}

Вот зависимости

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>8.0</version>
      <scope>provided</scope>
    </dependency>
 
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
 
    <dependency>
      <groupId>javax.enterprise</groupId>
      <artifactId>cdi-api</artifactId>
      <version>2.0.SP1</version>
      <scope>provided</scope>
    </dependency>
 
  </dependencies>
Но почему-то экземпляр класса Student не успевает инициализироваться и получается NullPointer.

начиная с Java 8 - beans.xml не нужен, но даже указав его ничего не получается.

В чем может быть ошибка и почему, ведь если технология CDI - такая волшебная, и все beans являются управляемыми, контейнер сервлетов должен был сам создать объект?

Добавлено через 5 часов 35 минут
Как оказалось, tomcat не поддерживает CDI из коробки, нужно использовать либо Weld либо OpenWebBeans

Настройка описана здесь http://balusc.omnifaces.org/20... omcat.html

Затем нужно зарегистрировать listener

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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/web-app_3_1.xsd"
         version="3.1">
 
    <display-name>Tomcat CDI example</display-name>
 
    <listener>
        <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
    </listener>
 
</web-app>
решено
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.12.2018, 17:37
Ответы с готовыми решениями:

Перезапуск сервлетов в Tomcat 4...
Установлен Tomcat 4... пишу сервлет, компилирую, запускаю работает... Изменяю, компилирую, запускаю - отображает тоже самое! Хорошо......

Как управлять вызовом сервлетов?
Как проще всего из одного управляющего сервлета вызывать другие, в зависимости от полученных ним параметров? И возвращать результат их...

Настройка Tomcat для разработки JSP и сервлетов
четко следую руководству http://www.coreservlets.com/Apache-Tomcat-Tutorial/ http://www.coreservlets.com/Apache-Tomcat-Tutorial/ 1. path...

3
52 / 18 / 11
Регистрация: 27.03.2013
Сообщений: 789
26.12.2018, 10:33  [ТС]
еще один момент.

Без файла beans.xml ,
XML
1
2
3
4
5
6
7
8
<?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"
        bean-discovery-mode="all">
</beans>
ничего не будет работать и он не должен быть пустым.

Listener можно не указывать в web.xml.
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
02.01.2019, 15:33
Цитата Сообщение от masli Посмотреть сообщение
Использование @Inject должна указывать компилятору, что управление beans передается контейнеру сервлетов.
Например указав данную аннотацию, над полем класса, объект указанного типа должен быть создан автоматически.
По аналогии с @Autowired мне казалось что @Inject делает другое, а именно : "вытягивает" нужный инстанс с контейнера и присваивает его вашему полю "student".
Чтобы его "вытянуть", его туда сначала нужно "впихнуть"(инициализировать), но сначала определить. Он должен быть или в виде xml (как бин в бинсах), или нормального java(POJO) класса (и вместо xml-пометок бина соответствующее анотирован).
А "впихнем" его таким образом, что будем искать либо в файле описания : <listener> - прослушивать, environment - среду, либо среди бинов bean-discovery-mode="all", либо будет создан соответствующий аннотированый(или имплементирующий что-то нужное) java класс который "прослушивается" и в котором аннотированы(типа @Bean) методы возвращающие нужные бины, например return new Student();
Несовсем понятно почему в вашем сервлете описание студента.

Не по теме:


П.С. это все конечно только представление человека(меня) который только пытался разобратся(и то не в tomcat ) и еще неизвесно как. И еще, ++ вам за то что отвечаете найдеными решениями, тем кто интересуется (как я) может пригодится.

0
52 / 18 / 11
Регистрация: 27.03.2013
Сообщений: 789
02.01.2019, 20:35  [ТС]
XML
1
bean-discovery-mode="all"
при таком указании CDI-контейнер будет считать, что все классы приложения, будут им управляемы, то есть нам не нужно устанавливать специальные аннотации, и можем смело устанваливать в Injection Point нужный Java Bean (то есть какой-то Java класс, не обязательно Pojo)

XML
1
bean-discovery-mode="annotated"
CDI-контейнер будет управлять только теми классами, над которыми установлена специальная аннотация (из Scope Types).

В точке инъекции (Injection Point ) вы над полем или сеттером (над конструктором не заработало), - устанавливает аннотацию @Inject.

CDI-контейнер автоматически создаст вам объект указанного типа и проинициализирует его, согласно внутренним правилам класса, создаваемого объекта.

Создаваемые объекты CDI-контейнер хранит где-то у себя и управляет их жизненным циклом.
Аннотации из Scope Types - определяют предельный срок существования этих объектов.

Добавлено через 2 минуты
XML
1
2
3
<listener>
        <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
    </listener>
Работает и без него.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.01.2019, 20:35
Помогаю со студенческими работами здесь

TomCat теряет session и beans
Уважаемые опытные пользователи! помогите решить проблему: на сервере Windows 2012 R2 установлен TomCat 8. на нем работает приложение с...

вопрос о ant, jboss, tomcat, beans .....
обьясните в чем смысл всего этого. tomcat я понимаю нужен для того чтобы java выполняласть на стороне сервера, ну если провести аналогию,...

Использование тэга select для Сервлетов
У меня есть программа, которая шифрует введенный пользователем текст. Она должна шифровать тремя разными способами. У меня интерфейс в...

Использование JSP на Tomcat
Кто-нибудь сталкивался с такими вещами?

Использование библиотеки Log4j в Tomcat
В проекте используется tomcat 6 и библиотека log4j 1.2. Возможно ли настроить tomcat для автоматического подхвата изменений в файле...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru