0

我采用了给定的 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): 565780121

onAttach 正在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): 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

更奇怪的是……如果我在部署时关闭自动在 Web 浏览器中打开我的 Tomcat 应用程序 URL 的功能,也就是说,如果我取消选中第一个选项卡部分中的After launch复选框,那么我只会得到一个实例如预期。我必须在浏览器中手动打开一个页面,然后粘贴 URL 。对,成功!Open browserServerRun/Debug ConfigurationsMainViewhttp://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 内存。
4

0 回答 0