在最新的 Spring Data Rest 版本中可以轻松完成!
您需要做的就是:
-
将投影名称作为请求参数传递
`/api/users/search/findEmployeeUsers?projection=userView`
-
从您的服务方法中返回 PagedModel<PersistentEntityResource> 而不是 Page<User>;
完成!
我假设你想从你的自定义控制器中调用这个服务方法,在这种情况下你需要从你的控制器方法中返回ResponseEntity<PagedModel<PersistentEntityResource>>。
不希望它可分页?只需返回 ResponseEntity<CollectionModel<PersistentEntityResource>> 即可。
另请查看example for single resoure projection。
Spring Data Rest 负责将 @Projections 应用于 api 请求上的 PersistentEntityResources,就像您不断从 @RepositoryRestResource 暴露您的 @RestResource;投影的相同行为,保持相同的命名约定,基本相同的 URI(对于当前示例)。
带有一点业务逻辑的服务方法可能如下所示:
@Override
@Transactional(readOnly = true)
public PagedModel<PersistentEntityResource> listEmployees(Pageable pageable, PersistentEntityResourceAssembler resourceAssembler) {
Page<User> users = userRepository.findEmployeeUsers(pageable);
List<User> entities = users.getContent();
entities.forEach(user -> user.setOnVacation(isUserOnVacationNow(user)));
CollectionModel<PersistentEntityResource> collectionModel = resourceAssembler.toCollectionModel(entities);
return PagedModel.of(collectionModel.getContent(), new PagedModel.PageMetadata(
users.getSize(),
users.getNumber(),
users.getTotalElements(),
users.getTotalPages()));
}
您的控制器方法可能如下所示:
@BasePathAwareController
public class UsersController {
@GetMapping(value = "/users/search/findEmployeeUsers")
ResponseEntity<PagedModel<PersistentEntityResource>> findEmployeeUsers(Pageable pageable,
PersistentEntityResourceAssembler resourceAssembler) {
return ResponseEntity.status(HttpStatus.OK)
.body(userService.listEmployees(pageable, resourceAssembler));
}
}
我正在使用 spring-boot-starter-data-rest:2.3.4.RELEASE 与 spring-data-rest-webmvc:3.3.4.RELEASE 和 spring-data-rest-webmvc:3.3.4.RELEASE作为依赖项,将其配置为我的 pom.xml 的父级
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>