# 在SpringBoot中集成部署React的一些坑
## 设置并打包React项目
首先确保React访问的服务器API地址为`{homepage}/api/**`
然后构建React项目,将构建后的所有文件都放在SpringBoot项目的`resources/static`文件夹下面
## 设置SpringBoot Controller,路由到index.html(并托管错误)
首先确保SpringBoot所有的Rest API的Controller都有前缀`api/`,这样方便后续维护。
我们知道,使用了BrowserRouter的React项目要保证几乎所有前端URL都转移到`index.html`中处理,但`public`等资源目录下的资源文件必须除外。那么怎样知道同一个host下,哪些URL应该由`index.html`处理,哪些应该直接作为静态资源访问,哪些又应该交给SprintBoot的自定义Controller呢?
React-Router的路由配置是写在前端工程里的,后端并不应该获取和维护,因此我们很难在没有特殊约定的情况下正向匹配所有需要显示前端页面的URL。可以考虑使用另一种视角实现业务,即:所有SpringBoot视为无效的URL(既不是静态资源,也不是自定义Controller)都响应`index.html`
可以使用如下方法实现:
- 使用`ControllerAdvice`捕获并处理非404异常
- 使用一个继承了`ErrorController`的Controller类,在其中的error监听方法中返回'/index.html'作为MVC视图文件
- 在`application.yml`中添加:
```yml
server:
error:
whitelabel:
enabled: false
```
这样,SpringBoot不能处理的URL就会响应React的`index.html`,React中能处理自然就会正常处理,而不能处理也可以建立一个兜底的通配符路由,用于显示错误页面;同时还不会影响SpringBoot的任何资源文件和任何注册的RequestMapping的正常访问