使用@RepositoryRestResource生成路径并为 REST API 注入所有必要的 HATEOAS 链接,但是当我使用控制器从存储库返回相同的结果时,JSON 结构是不同的,并且没有 HATEOAS 链接。
我如何返回从控制器获得与RepositoryRestResource生成的路径相同的JSON结构?
// /accounts (RepositoryRestResource JSON structure)
{
_embedded: {
accounts: []
},
_links: {
first: {},
self: {},
next: {},
last: {},
profile: {},
search: {}
},
page: {
size: 20,
totalElements: 35,
totalPages: 2,
number: 0
}
}
// /my-accounts (RestController JSON structure)
{
content: [ ... ], // accounts
pageable: {},
totalPages: 1,
totalElements: 2,
last: true,
size: 20,
number: 0,
sort: {},
numberOfElements: 2,
first: true
}
REST存储库:
@RepositoryRestResource(collectionResourceRel = "accounts", path = "accounts", itemResourceRel = "account")
public interface AccountRepository extends PagingAndSortingRepository<Account, Long> {
@RestResource(path = "owner", rel = "owner")
Page<Account> findByOwner(@Param("username") String owner,Pageable p);
}
REST控制器:
@RestController
public class AccountController {
private AccountRepository repo;
@Autowired
public AccountController(AccountRepository repo) {
this.repo = repo;
}
@RequestMapping(
path = "/my-accounts",
method = RequestMethod.GET,
produces = "application/hal+json")
public ResponseEntity<Page<Account>> getStatus(
@RequestParam(value = "page", defaultValue = "0", required = false) int page,
@RequestParam(value = "size", defaultValue = "20", required = false) int size,
Authentication authentication) {
String username = authentication.getName();
Page<Account> accounts = repo.findByOwner(username, PageRequest.of(page, size));
return ResponseEntity.ok(accounts);
}
}
不确定,但这可能有用:
return ResponseEntity.ok(new org.springframework.hateoas.Resource<>(accounts));
如果没有,则可以将帐户包装在扩展ResourceSupport的类中。因此,只需创建一些类AccountSupportextendsResourceSupport
并在其中添加所需的链接。它有很多实用方法,比如
add(linkTo(AccountController.class).withSelfRel());
或个人帐户的链接:
add(linkTo(AccountController.class).slash(idOfYourAccountInstance).withSelfRel())
基本上,Spring Data REST只是一个样板代码(如控制器)的默认实现,人们通常通过REST和使用Spring HATEOAS来编写公开Spring Data存储库的代码,即试图用手写控制器复制完全相同的效果意味着只需自己编写整个Spring Data REST,因此,这是一个坏主意。幸运的是,有些部分很容易复制。
如果您只谈到将分页链接添加到控制器的输出中(而没有实现其他东西,如search controller,在您的示例Spring Data REST控制器输出中有一个到它的链接),您可以看看Spring Data REST是如何做到这一点的。它使用Spring Data的PagedResourcesAssembler,它接受一个< code >页面并创建一个带有所需导航链接的HATEOAS资源。
因此,要添加分页链接,必须在控制器中注入PagedResourcesAssembler
实例并使用它:
public ResponseEntity<PagedResources> getStatus(
@RequestParam(value = "page", defaultValue = "0", required = false) int page,
@RequestParam(value = "size", defaultValue = "20", required = false) int size,
Authentication authentication,
PagedResourcesAssembler assembler) {
String username = authentication.getName();
Page<Account> accounts = repo.findByOwner(username, PageRequest.of(page, size));
return ResponseEntity.ok(assembler.toResource(accounts));
}
我一直在研究如何将Spring与REST结合使用的各种示例。我们的最终目标是Spring设置 我已经看到了两种不同的方法,用于在Spring中渲染REST > 在控制器中通过 通过存储库中的< code > @ RepositoryRestResource 我正在努力寻找的是,为什么你会使用一个而不是另一个。当尝试实施时,哪一个是最好的? 我们的数据库后端是Neo4j。
我正在试用新的Spring 4.0@RestController,以从控制器返回一个简单的文本响应: 当我访问/心跳时,我返回: 结果包括双引号,这是我没有想到的。 当我访问/heartbeat/test时,我会得到一个空响应,但我希望我还活着!文本 使现代化 卷曲-ihttp://myserver.com/rest/heartbeat HTTP/1.1 200 OK内容类型:applicatio
我正在构建我的第一个Spring Boot应用程序。但是我不能正确地得到我的requestMapping控制器的回答。 这是我的主要课程: 这是我的RestController: 如果我看一下日志,我可以看到“/hi”映射: 但是当我访问:http:localhost:8080/hi时,我看到了一个空白页面,我期望看到“Hello World”文本。 为什么我得到一个空白页面? ---编辑----
问题内容: 我有一个发出异步请求的函数。我如何从中返回响应/结果? 我尝试从回调中返回值,以及将结果分配给函数内部的局部变量并返回该局部变量,但这些方法均未真正返回响应(它们都返回或变量的初始值为任意值) 。 使用jQuery函数的示例: 使用node.js的示例: 使用承诺块的示例: 问题答案: 在 一 中的Ajax代表 异步 。这意味着发送请求(或接收响应)已从正常执行流程中删除。在您的示例中
使用promise的块的示例:
和服务: 例外情况 和异常控制器 如何才能在相同的方法中返回Zip文件或json消息?问题是,produces=“application/zip”,如果不这样做,就会收到正确的错误json,但它不会下载文件,否则反之亦然,谢谢