Spring DATA REST - 如何使用默认的spring实现将实体转换为自定义控制器中的资源

时间:2017-08-11 07:26:41

标签: spring spring-data-rest

我创建了一个自定义控制器,需要将实体转换为资源。我用@RepositoryRestResource注释注释了我的存储库。我想知道是否有一种方法可以从我的自定义控制器调用spring Data REST的默认功能,该控制器将实体序列化为具有嵌入其中的其他实体的链接的资源。

我不想从我的处理程序方法中返回实体,而是返回资源。

感谢。

1 个答案:

答案 0 :(得分:2)

非常简单,使用对象ResourceResources。例如 - 在此控制器中,我们添加自定义方法,该方法返回所有用户角色的列表:

@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