为什么在Vaadin Flow 11网络应用程序中,“ onAttach”在Tomcat下运行两次,而在Jetty下仅运行一次?

时间:2018-11-04 03:40:38

标签: tomcat intellij-idea jetty vaadin vaadin-flow

我使用了给定的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上仅运行一次?

也许与this Questionthis 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):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部分中的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


我正在使用:

  • IntelliJ Ultimate版本2018.3
  • Azul Systems通过Zulu JVM的Java 10.0.2(基于OpenJDK)
  • Tomcat 9.0.12
  • 码头9.4.11.v20180605
  • Base Starter创建的项目
  • Vaadin 11.0.1
  • macOS High Sierra
  • MacBook Pro(视网膜,15英寸,2013年末),内存为16 GB。

0 个答案:

没有答案