【问题标题】:Using PagedResourcesAssembler from Spring Data Core for HATEOAS link generation使用 Spring Data Core 中的 PagedResourcesAssembler 生成 HATEOAS 链接
【发布时间】:2018-01-15 03:14:24
【问题描述】:

在 Spring Data JPA documentation 中,它解释了如何使用 PagedResourcesAssembler 生成链接。该文档引用了 toResources() 方法,但据我所知,该方法不存在。我已经成功地为资源集合生成了链接,但我不知道如何为子资源生成链接。

这是我的控制器:

public HttpEntity<PagedResources<Party>> search(@RequestBody PartySearchRequest request,
                                                    Pageable pageable, PagedResourcesAssembler<Party> assembler ) {

        Map<String,String> searchFilters = RequestValidator.validateContractSearchFilters(request);

        Page<Party> parties = repository.findByFirstNameOrLastName(searchFilters.get("firstName"), searchFilters.get("lastName"), pageable);

        return new ResponseEntity(assembler.toResource(parties), HttpStatus.OK);

    }

这会产生以下 JSON:

{
  "_embedded": {
    "partyList": [
      {
        "firstNm": "John",
        "lastNm": "Doe",
      },
      {
        "firstNm": "Bob",
        "lastNm": "Smith",
       }
        ],
      }
    ]
  },
  "_links": {
    "first": {
      "href": "http://localhost:8080/v1/party/search?page=0&size=2"
    },
    "self": {
      "href": "http://localhost:8080/v1/party/search?page=0&size=2"
    },
    "next": {
      "href": "http://localhost:8080/v1/party/search?page=1&size=2"
    },
    "last": {
      "href": "http://localhost:8080/v1/party/search?page=7&size=2"
    }
  },
  "page": {
    "size": 2,
    "totalElements": 16,
    "totalPages": 8,
    "number": 0
  }
}

如您所见,我获得了整个派对搜索的链接,但没有获得单个派对对象的链接。 (我认为我的问题类似于这个问题:How to add HATEOAS links in a sub resource)但我不太确定,所以我发布了自己的问题。

任何帮助将不胜感激!谢谢!

【问题讨论】:

    标签: java spring spring-data spring-data-jpa spring-hateoas


    【解决方案1】:

    您需要对扩展 ResourceAssemblerSupport 的类的引用。

    这应该可以,将 myResourceAssembler 更改为您的类:

    在您的控制器中:

    private final MyResourceAssembler myResourceAssembler;
    
    public MyController(MyResourceAssembler myResourceAssembler) {
       this.myResourceAssembler = myResourceAssembler;
    }
    
    public HttpEntity<PagedResources<Party>> search(@RequestBody PartySearchRequest request,
                                                    Pageable pageable, PagedResourcesAssembler<Party> assembler ) {
    
        Map<String,String> searchFilters = RequestValidator.validateContractSearchFilters(request);
    
        Page<Party> parties = repository.findByFirstNameOrLastName(searchFilters.get("firstName"), searchFilters.get("lastName"), pageable);
    
        Link selfLink = linkTo(methodOn(this.getClass().view(pageable, null)).withSelfRel();
    
        return new ResponseEntity(assembler.toResource(parties, myResourceAssembler, selfLink), HttpStatus.OK);
    
    }
    

    而且,如果您不想要 selfLink:

    return new ResponseEntity(assembler.toResource(parties, myResourceAssembler), HttpStatus.OK);
    

    参考文献

    【讨论】:

    • 谢谢。我创建了一个 PartyResourceAssembler extends ResourceAssemblerSupport 但我在注入它时遇到了问题。我正在使用弹簧靴。有什么快速的建议吗?谢谢
    • 是否标注@Component
    • 愚蠢的错误 :) 现在它自动装配。因此,如果我理解正确,ResourceAssemblerSupport 会处理每个单独的资源链接,而 PagedResourcesAssembler 会处理整个资源?
    • 正确,您返回的资源是资源的集合。集合本身就是一种资源,它包含带有嵌套集合的 _embedded。每个嵌套的集合项都是一个单独的资源,具有它自己的一组链接。 PagedResourcesAssembler 处理诸如 prev/next 链接之类的事情。
    • 是的。我让一切正常。唯一的事情是,现在我必须为每个实体创建一个资源,然后为每个资源创建一个组装器。很多额外的类...关于如何不必为每个实体创建汇编程序和资源的任何建议?感谢您的所有帮助。
    猜你喜欢
    • 2016-05-23
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2019-05-21
    • 1970-01-01
    • 2014-11-17
    • 2018-07-23
    相关资源
    最近更新 更多