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

如何从@RestController返回@RepositoryRestResource样式的响应

宗政元青
2023-03-14

使用@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);
    }
}

共有2个答案

毋举
2023-03-14

不确定,但这可能有用:

return ResponseEntity.ok(new org.springframework.hateoas.Resource<>(accounts));

如果没有,则可以将帐户包装在扩展ResourceSupport的类中。因此,只需创建一些类AccountSupportextendsResourceSupport并在其中添加所需的链接。它有很多实用方法,比如

add(linkTo(AccountController.class).withSelfRel());

或个人帐户的链接:

add(linkTo(AccountController.class).slash(idOfYourAccountInstance).withSelfRel())
龙才俊
2023-03-14

基本上,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,但它不会下载文件,否则反之亦然,谢谢