因此,我试图通过spring将单个页面应用程序与常规REST API一起托管。
这意味着所有发往普通/api/
端点的请求均应由相应的控制器处理,而所有其他请求应定向到文件夹/static/built
中的资源
我已经通过捕获所有NoHandlerFoundExceptions
并重定向到js
文件或html
文件来工作了。然后使用WebMvcConfigurer
映射静态内容。
但是对我来说,这一切似乎都是骇客,那么,有没有那么轻松的方式呢?
答案 0 :(得分:1)
让SPA与Spring后端API配合使用的最简单方法是拥有2个不同的控制器:一个用于SPA的根索引页面,另一个用于管理各种RESTful API端点:
这是我的两个控制器:
MainController.java
@Controller
public class MainController {
@RequestMapping(value = "/")
public String index() {
return "index";
}
}
MonitoringController.java
@RestController
@RequestMapping(value = "api")
public class MonitoringEndpoints {
@GetMapping(path = "/health", produces = "application/hal+json")
public ResponseEntity<?> checkHealth() throws Exception {
HealthBean healthBean = new HealthBean();
healthBean.setStatus("UP");
return ResponseEntity.ok(healthBean);
}
}
请注意API端点控制器如何使用“ @RestConroller”注释,而主控制器如何使用“ @Conroller”注释。这是因为Thymeleaf如何利用它的ViewResolver。参见:
Spring Boot MVC, not returning my view
现在继续将您的index.html页面放在src / main / resources / templates / index.html,因为默认情况下,Spring在此位置查找html页面。
我的index.html页面如下:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head lang="en">
<meta charset="UTF-8"/>
<title>EDP Monitoring Tool</title>
</head>
<body>
<!-- Entry point to our ReactJS single page web application -->
<div id="root"></div>
<script type="text/javascript" src="built/bundle.js"></script>
</body>
</html>
不知道您是如何连接前端的,无论是ReactJS应用程序还是其他东西,但我相信这些信息将对您有所帮助。让我知道是否可以为您回答其他问题。
此外,如果您使用的是Webpack,则可以通过条目键下的webpack.config.js文件设置JS文件的入口点,如下所示:
entry: ['./src/main/js/index.js']
答案 1 :(得分:1)
通过添加以下映射来设法使React + ReactRouter应用程序正常工作:
@Controller
public class RedirectController {
@GetMapping(value = {"/{regex:\\w+}", "/**/{regex:\\w+}"})
public String forward404() {
return "forward:/";
}
}
的启发
答案 2 :(得分:-1)
我认为您正在寻找URL重写一词。
例如https://getpostcookie.com/blog/url-rewriting-for-beginners/