2017-05-03 54 views
1

我有春天般的数据仓库:如何添加链接收集实体

@RepositoryRestResource(collectionResourceRel = "items", path = "items") 
public interface ItemRepository extends CrudRepository<Item, Long> { 
} 

和我的自定义库:

@RepositoryRestController 
@ExposesResourceFor(Item.class) 
@RequestMapping("items") 
public class CustomItemController implements ResourceProcessor<RepositoryLinksResource> { 

    @Autowired 
    ItemRepository itemRepository; 


    @GetMapping(value = "/customMethod") 
    @ResponseBody 
    public List<String> customMethod() { 

     //some logic 
    } 

    @Override 
    public RepositoryLinksResource process(RepositoryLinksResource resource) { 
     resource.add(linkTo(methodOn(CustomItemController.class).customMethod()).withRel("customMethod")); 
     return resource; 
    } 
} 

我想有一个链接到自定义方法对收藏单位的级别,

{ 
    _embedded: { 
     items: [...] 
    }, 
    _links: { 
     self: { 
      href: "https://localhost:8080/api/items" 
     }, 
     profile: { 
      href: "https://localhost:8080/api/profile/items" 
     }, 
     search: { 
      href: "https://localhost:8080/api/items/search" 
     }, 
     customMethod: { 
      href: "https://localhost:8080/api/items/customMethod" 
     } 
    } 
} 

但在我的API的根级以上解决方案,我有它。如果我将RepositoryLinksResource更改为资源,我将在实体级别上使用该方法。任何想法/线索如何实现它?

回答

0

由于您使用Spring HATEOAS,因此该集合是PagedResources。 此外,我建议应用关注点分离并在单独的类中实现资源处理器,即不在控制器中。

您需要实现ResourceProcessor<PagedResources<Resource<CustomItem>>>

@Component 
public class CustomItemPageResourceProcessor implements ResourceProcessor<PagedResources<Resource<CustomItem>>> { 

@Override 
public PagedResources<Resource<CustomItem>> process(PagedResources<Resource<CustomItem>> pagedResources) { 
    Link link = BasicLinkBuilder.linkToCurrentMapping() 
           .slash(pagedResources.getId().getHref()) 
           .slash("customMethod") 
           .withRel("customMethod"); 
    pagedResources.add(link); 

    return pagedResources; 
} 

注意产生PagedResources<Resource<CustomItem>>将被添加的链接。例如,我没有找到一种方法来阻止在点击特定网址时生成链接。

+0

感谢您的回答,但此解决方案仅适用于扩展PagingAndSortingRepository的存储库,在我使用CrudRepository的情况下。 – Bartek

+0

这个信息很有用,你应该把它添加到你原来的文章中。无论如何,现在这一切都归结为找到T类型传递给'ResourceProcessor '也许'ResourceProcessor >'建议[这里](http://stackoverflow.com/a/24288077/5873923)。 –

相关问题