Java Spring引导不提供静态内容(angular cli)以在tomcat上提供应用程序
我正在努力解决一个问题,SpringBoot不能在8080上提供前端文件(通过angular创建)。我运行了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("/")
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运行
时,在frontend/src dir下生成角度文件。我可以手动复制、手动粘贴以放入静态文件夹,也可以更改ng build
以指向angular.json中的resources/static,这将在运行ng build cmd时直接将其放入其中。准确的 以上资源/静态屏幕截图中的文件outputPath
- 我没有使用javascript控制台,而是使用浏览器打开index.html IntellijIdea的选项,在网页上检查我看到错误-
替换
这是因为您使用的@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("/");
}
}