Vaadin Flow & Spring Boot 无法通过 servlet 上下文找到资源

Posted

技术标签:

【中文标题】Vaadin Flow & Spring Boot 无法通过 servlet 上下文找到资源【英文标题】:Vaadin Flow &Spring Boot cant find resource via servlet context 【发布时间】:2018-10-15 23:48:00 【问题描述】:

我遇到了新的 Vaadin Flow 问题,这让我在最后几天发疯了,所以我希望你们能帮助我。

我使用的技术:

    Vaadin Flow Beta 8 Spring Boot 2.0.1.RELEASE 嵌入式 Tomcat Maven 作为构建工具

项目布局:

父项目 | |-api | |–常见 | |-webapp

基本情况:我有一个单一的 Vaadin Flow 应用程序,现在我想将它分成 3 部分:webapp、common 和 api。在此拆分之前,一切正常。

当前情况:当我尝试导航到 localhost:8080/ 时出现以下错误:

Caused by: java.lang.IllegalStateException: Can't find resource 'frontend://styles/landing.html' via the servlet context
at com.vaadin.flow.component.polymertemplate.DefaultTemplateParser.getTemplateContent(DefaultTemplateParser.java:111) ~[flow-server-1.0.0.beta7.jar:na]
at com.vaadin.flow.component.polymertemplate.TemplateDataAnalyzer.parseTemplate(TemplateDataAnalyzer.java:180) ~[flow-server-1.0.0.beta7.jar:na]
at com.vaadin.flow.component.polymertemplate.TemplateInitializer.<init>(TemplateInitializer.java:91) ~[flow-server-1.0.0.beta7.jar:na]
at com.vaadin.flow.component.polymertemplate.PolymerTemplate.<init>(PolymerTemplate.java:78) ~[flow-server-1.0.0.beta7.jar:na]
at com.vaadin.flow.component.polymertemplate.PolymerTemplate.<init>(PolymerTemplate.java:93) ~[flow-server-1.0.0.beta7.jar:na]
at com.flatNow.ui.common.abstracts.AbstractView.<init>(AbstractView.java:6) ~[classes/:na]
at com.flatNow.ui.landing.LandingView.<init>(LandingView.java:23) ~[classes/:na]
at com.flatNow.ui.landing.LandingPresenter.<init>(LandingPresenter.java:18) ~[classes/:na]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_162]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_162]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_162]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_162]
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:170) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
... 109 common frames omitted

对应的View类是:

@Getter
@Tag("welcome-view")
@HtmlImport("styles/landing.html")
class LandingView extends AbstractView<TemplateModel> 

我的资源在 src/main/resources 下,有文件夹 frontend 和 assets。

我尝试了以下事情: 将 htmlImport 更改为 context://frontend/styles/landing.html 、 /frontend/styles/landing.html 、 ../frontend/styles/landing.html https://github.com/vaadin/skeleton-starter-flow-spring/issues/28

奇怪的是,我尝试在 Eclipse 中运行该项目,但它开箱即用。没有问题。

希望大家能帮帮我,如有遗漏请指出!

【问题讨论】:

【参考方案1】:

HTML 资源不是类路径资源,而是静态 Web 资源。 frontend:// 协议映射到 context://frontend(在开发模式下),后者又映射到上下文根 +”/frontend”,因此您应该放置静态文件,以便浏览器可以使用例如http://localhost:8080/frontend/styles/landing.html。

现在有了一个普通的战争风格项目,这将是 src/main/webapp/frontend/styles/landing.html。如果资源在另一个 jar 文件中,则标准位置是 /META-INF/resources/frontend/styles/landing.html。 Spring Boot 有一些其他/附加的方法来定义静态文件,只要它们可以通过 servlet 上下文找到,这些方法也应该没问题,正如所有静态资源所期望的那样。

如果你在 Eclipse 中运行,事情可能会略有不同,因为 Eclipse 不会将其他项目打包并使用为 jar 文件,而是直接使用其他项目文件

【讨论】:

以上是关于Vaadin Flow & Spring Boot 无法通过 servlet 上下文找到资源的主要内容,如果未能解决你的问题,请参考以下文章

Vaadin Flow 是不是支持 Spring-Boot Native

Vaadin Flow:删除 PollListener

在 Vaadin Flow 中的布局中居中小部件

Vaadin Flow / 10/11风格组件通过css

Vaadin Flow 应用程序自动在明暗模式之间切换

如何在 Vaadin Flow 14 中创建一个简单的 HTML 表格