Java Spring引导不提供静态内容(angular cli)以在tomcat上提供应用程序

Java Spring引导不提供静态内容(angular cli)以在tomcat上提供应用程序,java,spring,spring-mvc,spring-boot,tomcat,Java,Spring,Spring Mvc,Spring Boot,Tomcat,我正在努力解决一个问题,SpringBoot不能在8080上提供前端文件(通过angular创建)。我运行了ng build,将.ts ng组件文件转换为.js,并在outputPath:/resource/static文件夹中生成(我在angular.json文件中设置了outputPath)。 创建了一个控制器,用于提供来自资源/静态的内容 @Controller public class AppController { @GetMapping("/")

我正在努力解决一个问题,SpringBoot不能在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):

运行
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>
在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,所以不确定angular/ng内容会有什么不同,当tomcat启动并运行时,它无法提供这些内容

我是否需要任何其他配置来拥有spring boot前端代码?如有任何建议,我们将不胜感激

@戴维特回答你的问题:

  • 是的 build.gradle:
    compile('org.springframework.boot:springbootstarterweb:2.0.2.RELEASE')

  • 此处的静态内容: MYPROJECT/myprojectweb/src/main/resources/static/

  • 因为SpringBoot并没有从路径中拾取角度静态内容,所以我 已引用建议添加控制器的联机资源 专门为它服务。[我有3个可访问的ng组件- 登录主页销售。但是 为了访问tomcat端口,我想把文件放在static;rest之下 angular将负责布线。]

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

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

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


替换
这是因为您使用的@RestController注释隐式包含@ResponseBody。您必须使用@Controller for Spring boot自动加载html模板

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

无需像上面链接中那样复杂,即可实现成功的步骤:

  • 转到
    https://start.spring.io/
  • 选择了一个gradle项目
  • 添加了Web依赖项
  • 已下载并未归档结果(未从
    demo
    更改名称)
  • 创建:demo/src/main/resources/static/index.html,包含以下内容:您在 <html><body>YOU ARE IN!</body></html>
  • demo
    目录中发出以下命令以运行应用程序:
    /gradlew bootRun
  • 打开浏览器并转到
    http://localhost:8080/
  • 现在,您已经有证据证明,将某些内容放入
    myproject/src/main/resources/static/
    将生成HTML文件的内容

    因此,我有以下问题:

    • 您是否使用类似于
      compile('org.springframework.boot:springbootstarterweb')
      的东西将SpringMVC添加到springboot项目中

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

    • 如果为您提供了一个控制器,为什么您需要一个控制器来提供静态内容?尤其是映射到
      /
    • angular是否正在将*.html文件放入
      我的项目/src/main/resources/static/
    • javascript控制台说什么?找到
      runtime.js
      了吗
    请参见
    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

    在控制器方法上尝试将@RequestMapping注释作为建议

    像这样:

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

    在ComponentScan(basepackages{“com.packagename of modal classes”})上发生这种情况是因为spring试图处理您的请求,但它不知道这些请求应该是静态的。尝试添加以下配置:

    @Configuration
    public class MvcConfig implements WebMvcConfigurer {
    
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/ui/**").setViewName("/");
        }
    }
    

    其中
    addViewController(“/ui/**”)
    这是一种访问角度页面的模式

    我也尝试过@Controller注释,当浏览到localhost:8080时,网页上仍然没有显示任何ui内容[]。虽然我注意到chrome选项卡上有一个角度符号,所以它试图拾取内容,但在UI显示上没有任何内容。哦,好吧,您必须更改默认文件夹,这可以帮助您:从技术上讲,无论我在类路径(/resources,/static,/public等)的某个文件夹中放置什么内容,都会启动tomcat,它应该已经拾取index.html和相关内容。尽管我明确地指定并设置了spring.resources.static-locations(参见上面更新的代码),localhost:8080仍然没有显示任何UI。实际上,我插入了一个page1.html,其中只包含一个标题,以验证tomcat是否从resources文件夹中提取了任何内容,并且看起来好像没有。我在网页上也看不到它的内容。你能试着用“@SpringBootApplication”替换“@Configuration@EnableAutoConfiguration@ComponentScan({“webapp”})”吗?我已经在使用@GetMapping了,这不是一种使用@RequestMapping(method=RequestMethod.GET)的组合方式吗?编辑了我的答案,看看是否有帮助谢谢@DavitT的回复。请在我的帖子末尾看到你问题的答案。我只是对它们进行了更新。我遵循了demo gradle项目,并且确信我的项目/src/main/resources/static中的内容/
    @Controller
    @RequestMapping("/")
    public class AppController{ 
     }
    
    @Configuration
    public class MvcConfig implements WebMvcConfigurer {
    
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/ui/**").setViewName("/");
        }
    }