当前位置: 首页 > 知识库问答 >
问题:

我可以提供一个与Spring数据RestGET并行的endpoint吗?

束建章
2023-03-14

我的项目正在从自定义json格式转向json-hal和spring-data-rest。为了继续支持“旧”json,我想运行现有的资源控制器,并行于新的Spring-Data-Rest提供。

每当我配置spring-data-rest使用与现有控制器相同的url时,只使用旧的控制器,如果accept-header不匹配,我会得到一个错误响应。当我使用不同的网址时,一切正常

是否可以与spring data rest one并行运行控制器,并基于Accept标头进行响应?

旧控制器:

@RepositoryRestController
@RequestMapping(value = "/api/accounts", produces = {"application/custom.account+json"})
public class AccountResource {

    @RequestMapping(method = RequestMethod.GET)
    @PreAuthorize("#oauth2.hasScope('read') and hasRole('ROLE_ADMIN')")
    public ResponseEntity<List<Account>> getAll(
        @RequestParam(value = "page", required = false) Integer offset,
        @RequestParam(value = "per_page", required = false) Integer limit,
        @RequestParam(value = "email", required = false) String email
    ) throws URISyntaxException {
        ...
    }
}

共有1个答案

郑佐
2023-03-14

< code > @ repository rest controller 在类型级别上与< code>@RequestMapping不兼容。第一步,通过从RequestMapping中删除< code>produces参数(我在这里使用GetMapping快捷方式),确保您实际上设法捕获了请求。我还删除了@PreAuthorize注释,因为它现在不相关,并引入了一个参数来捕捉< code>Accept头值(用于调试):

@RepositoryRestController
public class AccountResource {

    @GetMapping(value = "/api/accounts")
    public ResponseEntity<List<Account>> getAll(
        @RequestParam(value = "page", required = false) Integer offset,
        @RequestParam(value = "per_page", required = false) Integer limit,
        @RequestParam(value = "email", required = false) String email,
    ) throws URISyntaxException {
        ...
    }

}

有了这个,你应该能够随意自定义GET /api/accounts,并且仍然受益于Spring Data Rest自动提供的POST/PUT/PATCH... /api/accounts,并且还断言内容类型

如果它按预期工作,那么您可以:

    < li >尝试在GetMapping批注中使用< code > produces = " application/custom . account JSON " (单个值不需要大括号)缩小方法范围,并查看您的endpoint和Spring生成的endpoint方法是否都可用 < li >恢复您的@预授权注释 < li >删除@RequestHeader参数

这给了你:

@RepositoryRestController  // NO MAPPING AT THE TYPE LEVEL
public class AccountResource {

    @GetMapping(value = "/api/accounts", // Mapping AT THE METHOD LEVEL
                produces = "application/custom.account+json") // the content-type this method answers to
    @PreAuthorize("#oauth2.hasScope('read') and hasRole('ADMIN')")  // ROLE is 'ADMIN' not 'ROLE_ADMIN'
    public ResponseEntity<List<Account>> getAll(
        @RequestHeader("Content-Type") String contentType,
        @RequestParam(value = "page", required = false) Integer offset,
        @RequestParam(value = "per_page", required = false) Integer limit,
        @RequestParam(value = "email", required = false) String email,
    ) throws URISyntaxException {
        ...
    }

}

现在:

  • curl host:port/api/accounts 将命中 Spring 控制器endpoint
  • curl host:port/api/accounts -H “Accept: application/custom.account json” 将命中你的自定义控制器终结点。
 类似资料: