【问题标题】:NullPointerException when initializing VaadinServlet using Vaadin 14使用 Vaadin 14 初始化 VaadinServlet 时出现 NullPointerException
【发布时间】:2021-05-13 20:03:27
【问题描述】:

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

当我的 servlet 初始化时,我得到一个 ServletException,这是由来自 Vaadin 代码的 NullPointerException 引起的。我查看了源代码,我可以看到当 Vaadin 尝试从 servlet 的 ServletContext 获取 Lookup 实例但它返回 null 时发生异常。我发现Lookup 实例应该被添加到LookupServletContainerInitializer 的上下文中,但在我的情况下似乎没有发生这种情况。

有谁知道可能导致此问题的原因? 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 更多

【问题讨论】:

    标签: vaadin vaadin-flow vaadin14


    【解决方案1】:

    LookupServletContainerInitializer 是一个javax.servlet.ServletContainerInitializer,它应该在初始化期间由 servlet 容器自动运行。

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

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

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

    【讨论】:

    • 感谢您的帮助。我按照您提供的示例进行操作,但我不再获得 NullPointerException,尽管我现在收到 /VAADIN/static/client 中的资源之一的 404 错误,我不确定它是否相关。你能澄清一下我应该将哪些 Vaadin 类传递给 DevModeInitializer 吗?我看到您将MainView 中使用的每个组件的类都传递给了它。是否有必要将我在应用程序中使用的每种组件的类传递给它?
    • 如果您是手动操作,那么您需要查看DevModeInitializer@HandlesTypes 注释,并为应用程序的类路径中实现或使用任何注释的所有相关内容传入类列出的接口或注释。然后对属于 Vaadin 的所有其他 ServletContainerInitializer 子类重复相同的操作。或者,将您的 servlet 容器配置为自动为您执行此操作。 /VAADIN/static/client 可能与 @PWA 有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多