我使用了给定的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 Web容器一起运行时,我看到:
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):565780121onAttach正在运行
MainView
类。 attachEvent.toString():com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@5ee75022]。 System.identityHashCode(this):1592217634
请注意,两个输出末尾的标识哈希不同。因此,尽管我只有一个用户(在部署和启动Tomcat之后,IntelliJ自动在浏览器中打开了一个页面),但我似乎正在创建两个MainView
实例。
➥onAttach
为什么在外部Tomcat上运行两次,而在内部Jetty上仅运行一次?
也许与this Question和this Question有关?
甚至更奇怪……如果我将IntelliJ Application context
(在第二个选项卡,Run/Debug Configuration
上)的Deployment
从/bogus_war_exploded
更改为/
,那么我获得MainView
的三个实例。
onAttach正在运行
MainView
类。 attachEvent.toString():com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@4664fd83]。 System.identityHashCode(this):1181023619onAttach正在运行
MainView
类。 attachEvent.toString():com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@2390403]。 System.identityHashCode(this):37291011onAttach正在运行
MainView
类。 attachEvent.toString():com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@461aa7e4]。 System.identityHashCode(this):1176152036
更加奇怪……如果我在部署时关闭了在Web浏览器中自动打开指向Tomcat应用程序的URL的功能,即取消选中After launch
部分中的Open browser
复选框, Server
中第一个标签Run/Debug Configurations
的位置,然后我只得到预期的单个MainView
实例。我必须在浏览器中手动打开一个页面,然后粘贴URL http://localhost:8080/bogus_war_exploded
。是的,成功!
但是这里发生了什么?是否存在与IntelliJ在浏览器中自动打开URL有关的错误?如果是这样,我想一种解决方法是手动打开浏览器和URL。还是发生了其他事情?
具有讽刺意味的是,我退出使用NetBeans并购买了IntelliJ,以避免那里出现相同的错误行为。请参阅堆栈溢出,Tomcat deploying the same application twice in netbeans。
我正在使用: