Spring Boot不提供静态内容(angular-cli),无法为tomcat上的应用提供服务

时间:2018-09-07 17:47:34

标签: java spring spring-mvc spring-boot tomcat

我在一个问题上苦苦挣扎,其中spring-boot不在8080上提供(通过angular创建的)前端文件。我运行ng build,将.ts ng组件文件转换为.js并在outputPath中生成:/ resource / static文件夹(我在angular.json文件中设置了outputPath)。 创建了一个控制器来提供资源/静态内容。

    @Controller
    public class AppController {
        @GetMapping("/")
        public String index() {
            return "index";
        }
     }

主类(src / mainjava / webapp / app):

@Configuration
@EnableAutoConfiguration
@ComponentScan({"webapp"})
public class Application extends WebMvcAutoConfiguration {

    public static void main(String[] args) {
    SpringApplication app = new SpringApplication(Application.class);
    app.run(args);
}
}

Ran ng build --base-href .生成文件,如下图所示。

index.html:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Welcome app</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <app-root></app-root>
<script type="text/javascript" src="runtime.js"></script><script type="text/javascript" src="polyfills.js"></script><script type="text/javascript" src="styles.js"></script><script type="text/javascript" src="vendor.js"></script><script type="text/javascript" src="main.js"></script></body>
</html>

注意:这是一个gradle项目。前端代码位于:src / main / java / webapp / frontend dir

/ resources中的Application.yml

server:
  servlet:
    context-path: /
  port: 8080

在tomcat上启动:

Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-09-13 12:45:34.372  INFO 96027 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-09-13 12:45:34.384  INFO 96027 --- [           main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in exceptionHandle
2018-09-13 12:45:34.405  INFO 96027 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path resource [static/index.html]
2018-09-13 12:45:34.566  INFO 96027 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-09-13 12:45:34.568  INFO 96027 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Bean with name 'dataSource' has been autodetected for JMX exposure
2018-09-13 12:45:34.575  INFO 96027 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Located MBean 'dataSource': registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
2018-09-13 12:45:34.620  INFO 96027 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''

我什至尝试在/ resources下添加html文件,以查看tomcat是否提供此文件夹中的任何内容。我也无法访问page1.html,因此不确定在tomcat启动并运行时无法提供的angular / ng内容会有什么不同。

resources/static

我是否需要任何其他配置以使spring-boot服务于有角度的前端代码?任何建议表示赞赏。

@DavidT对您的问题的回答:

  • 是 build.gradle:compile('org.springframework.boot:spring-boot-starter-web:2.0.2.RELEASE')

  • 静态内容在这里: MYPROJECT / MYPROJECT-web / src / main / resources / static /

  • 由于spring-boot没有从路径中选择角度静态内容,因此我 参考了建议添加控制器的在线资源 专门为它服务。 [我有3 ng组件可访问- 登录http://localhost:4200/家庭http://localhost:4200/home销售http://localhost:4200/sale。但 访问我想将文件置于静态下的tomcat端口;休息 角将负责布线。]

  • 从frotnend目录运行ng build时,会在frontend / src目录下生成角度文件。我可以手动复制,手动粘贴以放置在静态文件夹中,也可以更改outputPath以指向angular.json中的resources / static,将其直接放在运行ng build cmd的位置。精确 以上资源/静态屏幕截图中的文件。

  • 我还没有使用JavaScript控制台,而是使用浏览器打开index.html IntellijIdea中的选项,请在网页上检查我是否看到错误-

  

拒绝执行“”中的脚本,因为其MIME类型   ('text / html')不可执行,并且严格的MIME类型检查是   启用。

替换<script type to "text/html"可以从检查中删除这些错误,但http://localhost:8080/上仍然没有UI。

奇怪的是,当我从该演示项目中粘贴相同的index.html文件以将其粘贴到静态文件夹中时,浏览至http://localhost:8080时它什么也不显示。但是注意到在IntellijIdea中从浏览器选项打开此文件时(浏览器中的此URI:http://localhost:63342/MY-PROJ/MY-PROJ-WEB-main/static/index.html,然后显示了内容

<base href="/">是问题还是脚本标记?

4 个答案:

答案 0 :(得分:0)

这是因为您正在使用@RestController注释,该注释隐式包括@ResponseBody。您必须使用@Controller进行Spring启动才能自动加载html模板。

@Controller
public class AppController {
    @GetMapping("/")
    public String index() {
        return "index";
    }
 }

答案 1 :(得分:0)

迈向成功的步骤,而不必像上面的链接那样复杂:

  1. demo
  2. 选择了gradle项目
  3. 添加了Web依赖项
  4. 下载并取消存档结果(未从demo更改名称)
  5. 创建:带有以下内容的demo / src / main / resources / static / index.html:
    <html><body>YOU ARE IN!</body></html>
  6. ./gradlew bootRun目录中发出以下命令以运行您的应用程序:http://localhost:8080/
  7. 打开浏览器,然后转到MY PROJECT/src/main/resources/static/

您现在有证据证明,将某些内容放入compile('org.springframework.boot:spring-boot-starter-web')中将产生HTML文件的内容。

所以我有以下问题:

  • 您是否使用/之类的东西将SpringMVC添加到Spring Boot项目中?

  • 您是否已将静态内容放入“我的项目” / src / main / resources / static /?

  • 如果为您提供了静态内容,为什么需要控制器来提供静态内容?尤其是映射到MY PROJECT/src/main/resources/static/的那个?
  • 是否将 *。html 文件放入runtime.js文件中?
  • javascript控制台怎么说?是否找到https://spring.io/guides/gs/serving-web-content/

请参阅“添加主页”部分中的https://stackoverflow.com/questions/24661289/spring-boot-not-serving-static-content

请参见https://www.quora.com/How-can-spring-boot-serve-angular-static-files/answer/David-Talalayevsky内容,了解有关不执行操作(以及原因)的其他想法。

此信息最初发布于{{1}}

答案 2 :(得分:0)

在Controller方法上,尝试将@RequestMapping批注仅作为建议

赞:

@Controller
@RequestMapping("/")
public class AppController{ 
 }

在ComponentScan上(basepackages {“模态类的com.packagename”})

答案 3 :(得分:0)

发生这种情况是因为spring尝试处理您的请求,但它不知道它们应该变为静态。尝试添加以下配置:

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/ui/**").setViewName("/");
    }
}

addViewController("/ui/**")是访问有角页面的模式