【问题标题】:Spring Data REST Controller under configured base path配置的基本路径下的 Spring Data REST Controller
【发布时间】:2016-04-18 18:15:57
【问题描述】:

我正在使用 Spring Boot 1.3.1.RELEASE 并尝试创建自定义存储库 + 控制器。我将 basePath 配置为 /api,但无法弄清楚如何将自定义控制器的 URI 自动相对于 basePath。是不是我缺少什么魔法?

这是控制器。我也尝试了以下属性的每种组合。我把注释掉了,这样你就可以看到我的尝试了。

@RepositoryRestController
// @Controller
@ExposesResourceFor(AnalystSummaryModel.class)
// @RequestMapping("/analystsummaries")
public class AnalystSummaryController {

    @Autowired
    AnalystSummaryRepository repository;

    @Autowired
    private AnalystSummaryResourceAssembler resourceAssembler;

    @ResponseBody
    @RequestMapping(method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE})
    public PagedResources<AnalystSummaryModel> getAnalystSummaries(
            final Pageable pageable,
            final PagedResourcesAssembler assembler) {
        final Page<AnalystSummaryModel> analystSummaries = repository.findAll(pageable);
        return assembler.toResource(analystSummaries, resourceAssembler);
    }
}

我还基于另一个 question 创建了一个 ResourceProcessor。

当我查看 /api 端点时,我看到以下内容:

{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080"
    },
    "profile" : {
      "href" : "http://localhost:8080/api/profile"
    }
  }
}

当我取消注释 @RequestMapping 时,我会得到:

{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/analystsummaries"
    },
    "profile" : {
      "href" : "http://localhost:8080/api/profile"
    }
  }
}

我缺少什么让映射与我在 application.yml 中设置的 basePath 相关?

spring.data.rest.base-path:/api

更多信息:

使用@BasePathAware 实际上会导致这个控制器服务有两个不同的URI!它显示在 / 以及 /api/analystSummaries (因为自动复数等)。然后在使用 ControllerLinkBuilder 时,它使用第一个的路径。所以我更新的问题是:为什么这会暴露两次?如何消除隐式根(因为没有 @RequestMapping)并保留 /api 下的根?

【问题讨论】:

    标签: java spring spring-boot spring-data-rest spring-hateoas


    【解决方案1】:

    去掉spring.data.rest.base-path: /api并添加这个:

    server.servlet-path: /api
    

    【讨论】:

    • 我仍然想在根目录上提供一个 React 页面。这不会让服务器只听 /api 或下面的东西吗?
    • api 将是每个 url 的前缀。你没有在问题中提到反应用户界面
    • 谢谢,那么你的方法在这里行不通。我真的只需要 SDR 控制器位于 /api 下。根据 SDR 文档,这听起来应该可行。我在使用 @BasePathAware 时发现了一些其他发现,这些发现是我添加到我原来的问题中的
    • server.servlet.context-path=/api
    【解决方案2】:

    这可以通过 Spring boot 1.4.0.RC1 之后的特定配置来完成。

    How to configure a default @RestController URI prefix for all controllers?查看我的回答

    【讨论】:

      猜你喜欢
      • 2014-03-28
      • 2019-09-13
      • 2021-04-15
      • 2023-03-29
      • 2018-10-28
      • 2016-06-22
      • 1970-01-01
      • 2017-09-18
      • 2021-12-01
      相关资源
      最近更新 更多