使用 Vaadin 14 初始化 VaadinServlet 时出现 NullPointerException

Eva*_*van 6 vaadin vaadin-flow vaadin14

我正在将 Vaadin 8 应用程序升级到 Vaadin 14。我必须手动定义 的扩展,VaadinServlet而不是使用 Vaadin 14 的自动 servlet 注册,因为我需要将其映射到特定的 URL 模式。我使用web.xml与为 Vaadin 8 成功配置 servlet 相同的方式配置 servlet。

当我的 servlet 初始化时,我得到一个来自 Vaadin 代码的ServletException错误。我查看了源代码,可以看到当 Vaadin 尝试从 servletNullPointerException获取实例并且返回 null 时发生异常。我发现该实例应该添加到 中的上下文中,但在我的情况下似乎没有发生这种情况。LookupServletContextLookupLookupServletContainerInitializer

有谁知道可能导致此问题的原因是什么?下面是堆栈跟踪NullPointerException

引起原因:java.lang.NullPointerException
    在com.vaadin.flow.server.DeploymentConfigurationFactory.getTokenFileFromClassloader(DeploymentConfigurationFactory.java:341)
    在 com.vaadin.flow.server.DeploymentConfigurationFactory.getTokenFileContents(DeploymentConfigurationFactory.java:311)
    在 com.vaadin.flow.server.DeploymentConfigurationFactory.readBuildInfo(DeploymentConfigurationFactory.java:181)
    在 com.vaadin.flow.server.DeploymentConfigurationFactory.createInitParameters(DeploymentConfigurationFactory.java:174)
    在com.vaadin.flow.server.VaadinServlet.createDeploymentConfiguration(VaadinServlet.java:152)
    在 com.vaadin.flow.server.VaadinServlet.createServletService(VaadinServlet.java:190)
    在 com.vaadin.flow.server.VaadinServlet.init(VaadinServlet.java:77)
    在 org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:602)
    ... 28 更多

Lei*_*and 4

LookupServletContainerInitializerjavax.servlet.ServletContainerInitializer是servlet 容器在初始化期间自动运行的一个。

有两种典型情况会跳过这部分初始化:

  • web.xml配置为跳过某些步骤,例如因为metadata-complete设置为 true 或存在空<absolute-ordering>
  • 如果您要嵌入 servlet 容器而不是将其作为独立服务器运行,则可能需要显式启用该功能。对于 Jetty,您需要启用该AnnotationConfiguration模块,并且可能还需要设置ContainerIncludeJarPattern属性以至少包含包含VaadinServlet相关类的 .jar 文件。

第三种选择是ServletContainerInitializer通过手动实例化和调用 Vaadin 使用的初始化程序来进行模拟。需要进行一些尝试和错误才能准确发现哪些初始化程序需要使用哪些参数运行。我在https://github.com/Legioth/vaadin-without-classpath-scanning中创建了一个示例,但这是之前LookupServletContainerInitializer介绍的,因此您必须单独处理该示例。

  • 如果您手动执行操作,则需要查看“DevModeInitializer”的“@HandlesTypes”注释,并传入应用程序类路径上实现或用任何列出的接口或注释注释的所有相关内容的类。然后对属于 Vaadin 一部分的所有其他“ServletContainerInitializer”子类重复相同的操作。或者,将您的 servlet 容器配置为自动为您执行此操作。`/VAADIN/static/client` 可能与 `@PWA` 相关。 (2认同)