【问题标题】:spring boot: separate REST from static contentspring boot:将 REST 与静态内容分开
【发布时间】:2017-10-11 22:59:33
【问题描述】:

我正在使用 spring-boot-starter-data-rest 和 spring-boot-starter-web。 我使用 CrudRepository 做了一个简单的项目,让 spring boot 生成其余请求映射。

现在,我想在 ./ 下添加一个客户端 - 进行其余的调用。 因此,我正在尝试使用 /apirest 调用(并且只有那些!) 的路径添加前缀

我尝试了以下答案: How to specify prefix for all controllers in Spring Boot? 使用 application.properties 文件中的设置

  • server.contextPath=/api/*
  • spring.data.rest.basePath=/api/*.

但仍然无法使用 ./ 获取静态内容(例如 index.html、*.js、*.css)。网址也以“/api/”为前缀。 其余的调用在 /api/foos 下得到正确处理。

有没有办法告诉 spring 不要将导致位于 src/main/resources/public 中的源的 url 视为“rest-controllers”?

更新

设置属性
spring.data.rest.basePath=/api/*
完美运行。 (我的沙箱中仍然有一个程序化 bean 配置覆盖了这个设置)。

【问题讨论】:

  • 前端使用什么框架? thymeleaf、jsp 等......你想要像 @RestController @RequestMapping("/") public class IndexController{ ... } 这样的东西。那么,当您访问 localhost:8080/ 时(index.html 应该显示正确)?
  • 嗨@Jesse,我在前端使用AngularJS,因此没有服务器端技术。正如你所建议的,我希望 localhost:8080/ 显示 index.html
  • 将您的 AnuglarJS 应用程序放在一个单独的项目中,并在开发期间从一个单独的位置提供它。这意味着更多的前期工作,但它会在一两个月内为卓越的设计和大规模的工具改进带来红利
  • 我确实有两个独立的项目,因为我支持松散耦合。只有在想要同时部署后端和前端时才会出现问题:)。

标签: spring-boot spring-rest


【解决方案1】:

Spring 控制器是为同时提供 HTML 和 JSON/XML 服务而设计的。第一个是通过 Spring MVC Views 和 Thymeleaf 等模板引擎完成的,后者完全由 Spring 和 @RestController 处理。

没有办法只为返回 JSON 或 XML 数据的控制器提供上下文路径,而对其他控制器也没有,这也适用于静态内容。你通常做的是有一些静态变量,其中包含你想要的 API 前缀,以及在控制器的 @RequestMapping 中的使用。即

@RestController
@RequestMapping(MyConstants.API_LATEST + "/bookings")
public class MyBookingsController {
    ...
}

无论如何,您可能想用这些方法来解决前缀问题。当您有重大更改时,通常必须支持较旧的 API 版本,至少在一段时间内是这样。

【讨论】:

  • 嗨@gogstad。我是 Spring 新手,只是尝试进行基本的后端/前端设置工作。请注意,此时我不需要使用 Restcontroller 或 RequestMapping,因为我使用了 CrudRepository 并且 spring 确实处理了请求/处理程序映射。然而,由于 Spring boot 提倡约定优于配置,在我看来应该有一些通用的解决方案来部署由 rest 服务支持的前端 html 服务器。因此,我正在寻找一个设置,告诉 Spring,对于所有 RestController,在其路径前加上 /api/ 并将该路径映射到该控制器。
  • (与将前端与后端分离而不是副产品相比,版本控制不应该作为正交功能受到威胁吗?)
  • Spring-boot 会为你放在类路径上的publicstatic 路径中的任何内容提供服务。至于访问CrudRepository中的数据,你需要在@Controller@RestController前面有@RequestMappings,以便定义url-to-crudrepository方法映射;我不知道有任何约定。没有简单的方法只为应用程序的 @RestControllers 加上前缀。关于版本控制的要点是,如果您需要对 api 进行版本控制,您(可能)最终会在 RequestMappings 中使用静态常量,您也可以在其中包含 api 前缀。
猜你喜欢
  • 2018-02-10
  • 1970-01-01
  • 2018-06-26
  • 2023-03-08
  • 2017-07-19
  • 2017-04-05
  • 2017-03-25
  • 1970-01-01
相关资源
最近更新 更多