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

时间:2018-05-05 18:24:38

标签: spring-boot vaadin vaadin4spring vaadin10

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

我使用的技术:

  1. Vaadin Flow Beta 8
  2. Spring Boot 2.0.1.RELEASE
  3. 嵌入式Tomcat
  4. Maven as build tool
  5. 项目布局:

    父项目
     |
     | -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下,有文件夹前端和资源。

    我尝试以下事情:
    将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 个答案:

答案 0 :(得分:2)

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文件,而是直接使用其他项目文件