0

我们目前正在开发基于 Vaadin Flow Starter 包的新 Vaadin Web 应用程序。它与一个码头服务器一起运行,该服务器是通过一个 Maven 调用启动的。最近经常弹出一个错误,阻止我在浏览器中访问应用程序,导致只有一个异常堆栈跟踪(在浏览器中以及在后端),上面写着com.vaadin.flow.server.VaadinSession cannot be cast to com.vaadin.flow.server.VaadinSession. 这是完整的堆栈跟踪。

javax.servlet.ServletException: javax.servlet.ServletException: com.vaadin.flow.server.ServiceException: java.lang.ClassCastException: com.vaadin.flow.server.VaadinSession cannot be cast to com.vaadin.flow.server.VaadinSession
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle(Server.java:531)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:352)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:281)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:762)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:680)
    at java.lang.Thread.run(Thread.java:748)
Caused by: javax.servlet.ServletException: com.vaadin.flow.server.ServiceException: java.lang.ClassCastException: com.vaadin.flow.server.VaadinSession cannot be cast to com.vaadin.flow.server.VaadinSession
    at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:302)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:857)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:535)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1317)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1219)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:219)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)
    ... 15 more
Caused by: com.vaadin.flow.server.ServiceException: java.lang.ClassCastException: com.vaadin.flow.server.VaadinSession cannot be cast to com.vaadin.flow.server.VaadinSession
    at com.vaadin.flow.server.VaadinService.handleExceptionDuringRequest(VaadinService.java:1535)
    at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1498)
    at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:300)
    ... 33 more
Caused by: java.lang.ClassCastException: com.vaadin.flow.server.VaadinSession cannot be cast to com.vaadin.flow.server.VaadinSession
    at com.vaadin.flow.server.VaadinService.readFromHttpSession(VaadinService.java:2071)
    at com.vaadin.flow.server.VaadinService.loadSession(VaadinService.java:2051)
    at com.vaadin.flow.server.VaadinService.getExistingSession(VaadinService.java:942)
    at com.vaadin.flow.server.VaadinService.doFindOrCreateVaadinSession(VaadinService.java:791)
    at com.vaadin.flow.server.VaadinService.findOrCreateVaadinSession(VaadinService.java:766)
    at com.vaadin.flow.server.VaadinService.findVaadinSession(VaadinService.java:624)
    at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1480)
    ... 34 more

现在堆栈跟踪本身是一种,我以前从未见过类似的东西,因为它说它不能将 VaadinSession 转换为 VaadinSession,这是不幸的。我很确定这些东西是由 Vaadin 本身处理的,我只是将它用作黑盒,所以现在我真的不知道这个错误来自哪里以及如何修复它。

我正在扩展一个 VaadinServlet 以连接到 servlet 和会话初始化,但代码非常简单(尽管我不得不说我不是会话初始化的大师,所以我只是从其他一些教程中删除了它)。我不确定这是否与它有关,无论如何,这是代码。

@Override
protected void servletInitialized() throws ServletException {
    super.servletInitialized();
    getService().addSessionInitListener(this);
    getService().addSessionDestroyListener(this);
    logger.info("servlet initialized");
}

@Override
public void sessionInit(SessionInitEvent event) throws ServiceException {
    // Do session start stuff here
    logger.info("session initialized");
    SessionBean sessionBean = new SessionBean();
    sessionBean.setPlant(Config.getInstance().getPlant());
    // TODO Berechtigungen aus dem Nutzer auslesen
    sessionBean.setAuthorizations(AUTHS);
    event.getSession().setAttribute(SessionBean.class, sessionBean);
    event.getSession().setAttribute(BPService.class, new BPService());
}

@Override
public void sessionDestroy(SessionDestroyEvent event) {
    event.getSession().setAttribute(SessionBean.class, null);
    event.getSession().setAttribute(BPService.class, null);
}

该错误发生在热部署以及新启动时。重新启动应用程序服务器不一定能解决问题。一旦页面调用中发生错误(无论哪个浏览器,我在 Chrome、Opera、Firefox 和 IE 中都有这些错误),如果我刷新此特定页面或尝试从同一浏览器的新窗口。如果我切换到隐身窗口或切换浏览器,它不会出现在新窗口中,但仍然会在旧窗口中弹出。

当前配置

  • Vaadin 12.0.0(也发生在 11.0.2 中)
  • mvn jetty:run有一个码头 9.4.11.v20180605
  • 爪哇 1.8

我想我目前正在使用完整的 Vaadin Flow 东西,我不确定它如何处理依赖关系,但这是我现在对 Vaadin 的唯一依赖:

<dependency>
    <groupId>com.vaadin</groupId>
    <artifactId>vaadin-bom</artifactId>
    <version>${vaadin.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

我尝试将码头服务器切换到不同的版本,但没有成功。将 Vaadin 从 11 更新到 12 也对错误没有影响。

4

0 回答 0