我创建了一个自定义控制器,需要将实体转换为资源。我用@RepositoryRestResource注释注释了我的存储库。我想知道是否有一种方法可以从我的自定义控制器调用spring Data REST的默认功能,该控制器将实体序列化为具有嵌入其中的其他实体的链接的资源。
我不想从我的处理程序方法中返回实体,而是返回资源。
感谢。
答案 0 :(得分:2)
非常简单,使用对象Resource
或Resources
。例如 - 在此控制器中,我们添加自定义方法,该方法返回所有用户角色的列表:
@RepositoryRestController
@RequestMapping("/users/roles")
public class RoleController {
@GetMapping
public ResponseEntity<?> getAllRoles() {
List<Resource<User.Role>> content = new ArrayList<>();
content.addAll(Arrays.asList(
new Resource<>(User.Role.ROLE1),
new Resource<>(User.Role.ROLE2)));
return ResponseEntity.ok(new Resources<>(content));
}
}
要添加资源链接,您必须使用对象RepositoryEntityLinks
,例如:
@RequiredArgsConstructor
@RepositoryRestController
@RequestMapping("/products")
public class ProductController {
@NonNull private final ProductRepo repo;
@NonNull private final RepositoryEntityLinks links;
@GetMapping("/{id}/dto")
public ResponseEntity<?> getDto(@PathVariable("id") Integer productId) {
ProductProjection dto = repo.getDto(productId);
return ResponseEntity.ok(toResource(dto));
}
private ResourceSupport toResource(ProductProjection projection) {
ProductDto dto = new ProductDto(projection.getProduct(), projection.getName());
Link productLink = links.linkForSingleResource(projection.getProduct()).withRel("product");
Link selfLink = links.linkForSingleResource(projection.getProduct()).slash("/dto").withSelfRel();
return new Resource<>(dto, productLink, selfLink);
}
}
有关更多示例,请参阅我的“how-to”和sample project。