@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" 将命中您的自定义控制器端点。