我有一个类似的弹簧数据存储库:
@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 :(得分: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时生成链接。