如何添加链接到集合实体

时间:2017-05-03 13:45:21

标签: java rest spring-data-rest spring-hateoas

我有一个类似的弹簧数据存储库:

@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,我将在实体级别上拥有该方法。任何想法/线索如何实现它?

1 个答案:

答案 0 :(得分: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>>都会添加链接。例如,我没有找到一种方法来阻止在点击特定URL时生成链接。