2017-08-11 155 views
1

我创建了需要实体转化为资源定制控制器实体转化为资源,定制控制器。我使用@RepositoryRestResource注释来注释我的存储库。我想知道是否有办法,我可以从中序列化实体资源的链接嵌入其中的其他实体我自定义控制器调用春天数据REST的默认功能。春天DATA REST - 如何使用默认的春天实现

我不想从我的处理方法,但资源返回实体。

谢谢。

+1

不要忘了接受/给予好评的答案,如果它帮助你..) – Cepr0

回答

1

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

@RepositoryRestController 
@RequestMapping("https://stackoverflow.com/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