自定义查询的响应格式不同于 PagingAndSortingRepository

Response format from Custom Query different from PagingAndSortingRepository

我有一个简单的 spring-boot 应用程序,它包含一个扩展 JpaRespository 的存储库(它又扩展了 PagingAndSortingRepository:

@RestController
@RepositoryRestResource
public interface CatalogueOrderRepository extends JpaRepository<CatalogueOrder, Long>,
    QuerydslPredicateExecutor<CatalogueOrder> {

    @GetMapping("/orderStatusNot")
    Page<CatalogueOrder> findByOrderStatusNot(String orderStatus, Pageable page);
}

除了提供基本 CRUD/paging/sorting 端点的 JpaRepository 之外,我还使用方法命名创建了自定义 query/endpoint - findByOrderStatusNot.

PagingAndSortingRepository 中定义的默认 findAll() 方法似乎 return 和 Page<T>,与我在 findByOrderStatusNot 中定义的相同。然而,他们的实际 JSON 反应似乎大不相同。

/catalogueOrders returns 大致:

_embedded:
  catalogueOrders: [
    catalogueOrder + _links
  ]
_links:
  self
  profile
  search
page:
  size
  totalElements
  totalPages
  number

orderStatusNot returns 大致:

content: [
  {catalogueOrder}...
]
pageable:
pageable:
  sort:
    sorted
    unsorted
    empty
  offset
  pageSize
  pageNumber
  paged
  unpaged
last
totalElements
totalPages
size
number
sort:
  sorted
  unsorted
  empty
numberOfElements
first
empty

为什么默认提供的端点会提供如此不同的结果?以及如何使我的端点与 findAll() 一致?

第一个输出是 Hypertext Application Language (hal)@RepositoryRestResource 注释方法创建的。

另一个输出是从 QuerydslPredicateExecutor 编辑的一个简单页面 return,缺少所有链接。

所以主要问题是您将 spring 数据 rest 与 query-dsl-jpa 混合在一起。他们 return 不同的媒体类型。

如果您想坚持使用您的依赖项,您可以尝试使用 @RepositoryRestResource(exported = false) 禁用 hal,但我想响应仍然会有所不同。

我建议摆脱 spring-data-rest 依赖。只需使用指向 findAll 的控制器 JpaRepository 和您要使用的其他方法。另一个优势还在于您的应用程序更具声明性,这意味着您必须明确打开并描述您的端点。