Я взял данное приложение Vaadin 11.0.1 Base Starter и просто добавил переопределение метода onAttach
. Этот метод вызывается подсистемой Vaadin, когда ваш компонент подключен к экрану. Итак, если приложение запускается один раз, мы должны увидеть, что этот метод вызывается один раз.
package com.basilbourque.example;
import com.vaadin.flow.component.AttachEvent;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Route;
/**
* The main view contains a button and a click listener.
*/
@Route ( "" )
public class MainView extends VerticalLayout {
public MainView () {
Button button = new Button( "Click me" ,
event -> Notification.show( "Clicked!" ) );
add( button );
}
@Override
protected void onAttach ( AttachEvent attachEvent ){
System.out.println( "onAttach running for `MainView` class. attachEvent.toString(): " + attachEvent + ". System.identityHashCode(this): " + System.identityHashCode(this));
}
}
При запуске со стандартным веб-контейнером Jetty я вижу:
onAttach работает для MainView
класса. attachEvent.toString (): com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@454ff330]. System.identityHashCode (this): 1162867504
Но когда я запускаю внешнюю версию Tomcat 9.0.12 для вызова IntelliJ Ultimate, версия 2018.3, я вижу следующее:
onAttach работает для MainView
класса. attachEvent.toString (): com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@21b91e99]. System.identityHashCode (this): 565780121
onAttach работает для MainView
класса. attachEvent.toString (): com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@5ee75022]. System.identityHashCode (this): 1592217634
Обратите внимание, что хэш идентификатора в конце обоих выходов отличается. Похоже, я получаю два экземпляра MainView
, созданных несмотря на то, что у меня только один пользователь (одна страница автоматически открывается IntelliJ в браузере после развертывания и запуска Tomcat).
➥ Почему onAttach
работает дважды на внешнем Tomcat, но только один раз на внутреннем Jetty?
Возможно, относится к этому Вопросу и к этому Вопросу ?
Еще страннее ... Если я изменю Application context
IntelliJ Run/Debug Configuration
(на 2-ой вкладке Deployment
) с /bogus_war_exploded
на /
, то получу три экземпляра MainView
работает.
onAttach работает для MainView
класса. attachEvent.toString (): com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@4664fd83]. System.identityHashCode (this): 1181023619
onAttach работает для MainView
класса. attachEvent.toString (): com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@2390403]. System.identityHashCode (this): 37291011
onAttach работает для MainView
класса. attachEvent.toString (): com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@461aa7e4]. System.identityHashCode (this): 1176152036
Еще больше странностей ... Если я отключаю функцию автоматического открытия URL-адреса моего приложения Tomcat в веб-браузере при развертывании, то есть если я сниму флажок After launch
в разделе Open browser
первой вкладки Server
в Run/Debug Configurations
, тогда я получаю только один экземпляр MainView
, как и ожидалось. Я должен вручную открыть страницу в браузере и вставить URL http://localhost:8080/bogus_war_exploded
. Да, успехов!
Но что здесь происходит? Есть ли ошибка, связанная с автоматическим открытием IntelliJ URL в браузере? Если это так, я полагаю, что обходной путь - это вручную открыть браузер и URL. Или что-то еще происходит?
По иронии судьбы, я перестал использовать NetBeans и купил IntelliJ, чтобы избежать такого же ошибочного поведения. См. Переполнение стека, Tomcat, дважды развертывающее одно и то же приложение в NetBeans .
Я использую:
- IntelliJ Ultimate edition 2018.3
- Java 10.0.2 через Zulu JVM от Azul Systems (на основе OpenJDK)
- Tomcat 9.0.12
- Причал 9.4.11.v20180605
- Проект создан из Base Starter
- Ваадин 11.0.1
- macOS High Sierra
- MacBook Pro (Retina, 15-дюймовый, конец 2013 г.), 16 ГБ памяти.