在最新的Spring Data Rest版本中,这可以很容易地完成!
你只需要做以下几步:
pass projection name as request param
`/api/users/search/findEmployeeUsers?projection=userView`
return PagedModel<PersistentEntityResource>
instead of Page<User>
from your service method;
完成!
我假设您想从自定义控制器调用此服务方法,在这种情况下,您需要从控制器方法返回 ResponseEntity<PagedModel<PersistentEntityResource>>
。
不想使用分页?只需返回 ResponseEntity<CollectionModel<PersistentEntityResource>>
。
还可以查看单一资源投影示例。
Spring Data Rest会在API请求中应用@Projection
到PersistentEntityResource
上,就像您保持从@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的父级。请注意保留HTML标签。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!
</parent>
com.fasterxml.jackson.core.JsonGenerationException: Can not start an object, expecting field name
异常。 - adam p@Projection
注释中按name
属性查找投影?在默认的JpaRepository实现中,这个查找是如何工作的?这个评论是否值得单独提出一个问题? - Michal