2017-05-03 6 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를 Resource로 변경하면 엔티티 레벨에서 메소드를 갖게됩니다. 어떤 아이디어/단서 그것을 구현하는 방법?

답변

0

스프링 HATEOAS를 사용하고 있으므로 컬렉션은 PagedResources입니다. 또한 관심사를 분리하고 리소스 처리기를 별도의 클래스 (컨트롤러가 아닌)에 구현하는 것이 좋습니다.

당신은 ResourceProcessor<PagedResources<Resource<CustomItem>>>를 구현해야합니다 모든 생성 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; 
} 

참고. 예를 들어, 특정 URL을 때 링크를 생성하지 못하도록하는 방법을 찾지 못했습니다.

+0

답변 주셔서 감사합니다. 그러나이 솔루션은 PagingAndSortingRepository를 확장하는 리포지토리에서만 작동합니다. 제 경우 CrudRepository를 사용합니다. – Bartek

+0

이 정보는 유용하며 원래 게시물에 추가해야합니다. 어쨌든 이제는 T 타입이'ResourceProcessor ''ResourceProcessor >'에 건네 져야한다고 제안합니다 (http://stackoverflow.com/a/24288077/5873923). –