我可以提供与 spring-data-rest GET 并行的端点吗?

2024-01-03

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

每当我将 spring-data-rest 配置为使用与现有控制器相同的 url 时,仅使用旧控制器,如果接受标头不匹配,我会收到错误响应。当我使用不同的网址时,一切正常

是否可以与 spring-data-rest 并行运行一个控制器并根据 Accept-Header 进行响应?

旧控制器:

@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 {
        ...
    }
}

@RepositoryRestController玩不好@RequestMapping at the 类型级别 https://jira.spring.io/browse/DATAREST-535。 第一步,通过删除produces来自 RequestMapping 的参数(我在这里使用 GetMapping 快捷方式)。我还删除了 @PreAuthorize 注释,因为它现在不相关,并引入了一个参数来捕获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 {
        ...
    }

}

有了这个,您应该能够自定义获取/api/帐户随意并仍然受益POST/PUT/PATCH.../api/accounts由 Spring Data Rest 自动提供,并断言内容类型

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

  • 尝试缩小方法范围produces = "application/custom.account+json"(单个值不需要大括号)在 GetMapping 注释中,并查看您的端点和 Spring 生成的端点方法都可用
  • 恢复您的@PreAuthorize注释
  • 去掉@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 {
        ...
    }

}

Now:

  • curl 主机:端口/api/accounts 将到达 Spring 控制器端点
  • curl 主机:端口/api/accounts -H "Accept: application/custom.account+json" 将命中您的自定义控制器端点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以提供与 spring-data-rest GET 并行的端点吗? 的相关文章

随机推荐