使用Spring Boot托管一个页面应用程序

时间:2019-01-25 07:56:18

标签: spring spring-boot spring-mvc single-page-application

因此,我试图通过spring将单个页面应用程序与常规REST API一起托管。

这意味着所有发往普通/api/端点的请求均应由相应的控制器处理,而所有其他请求应定向到文件夹/static/built中的资源

我已经通过捕获所有NoHandlerFoundExceptions并重定向到js文件或html文件来工作了。然后使用WebMvcConfigurer映射静态内容。

但是对我来说,这一切似乎都是骇客,那么,有没有那么轻松的方式呢?

3 个答案:

答案 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:/";
  }

}

这是受https://stackoverflow.com/a/42998817/991894

的启发

答案 2 :(得分:-1)

我认为您正在寻找URL重写一词。

例如https://getpostcookie.com/blog/url-rewriting-for-beginners/