我采用了给定的 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 上只运行一次?
更奇怪的是……如果我Application context
将 IntelliJ Run/Debug Configuration
(在第二个选项卡上Deployment
)从/bogus_war_exploded
更改为 just /
,那么我将获得三个运行实例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
复选框,那么我只会得到一个实例如预期。我必须在浏览器中手动打开一个页面,然后粘贴 URL 。对,成功!Open browser
Server
Run/Debug Configurations
MainView
http://localhost:8080/bogus_war_exploded
但是这里发生了什么?是否存在与 IntelliJ 在浏览器中自动打开 URL 相关的错误?如果是这样,我想一种解决方法是手动打开浏览器和 URL。还是发生了其他事情?
具有讽刺意味的是,我放弃使用 NetBeans 并购买了 IntelliJ 以避免在那里出现同样的错误行为。请参阅 Stack Overflow,Tomcat 在 netbeans 中两次部署相同的应用程序。
我在用:
- IntelliJ 终极版 2018.3
- 通过 Azul Systems 的 Zulu JVM(基于 OpenJDK)的 Java 10.0.2
- 雄猫 9.0.12
- 码头 9.4.11.v20180605
- 从Base Starter创建的项目
- 瓦丁 11.0.1
- macOS 高山脉
- MacBook Pro(Retina,15 英寸,2013 年末),16 gigs 内存。