考虑Custom implementations for Spring Data repositories我正在使用存储库中的@RepositoryRestResource
来生成所有HATEOAS生成的物品:
@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<PersonNode,Long>,
PersonRepositoryCustom {
List<PersonNode> findBySurname(@Param("0") String name);
}
现在,按照上面提到的文档,我创建了PersonRepositoryCustom
,其中包含一些简单的方法用于介绍目的:
public interface PersonRepositoryCustom {
public String printPerson(PersonNode personNode);
}
实施是:
public class PersonRepositoryImpl implements PersonRepositoryCustom{
@Override
public String printPerson(PersonNode personNode) {
return "It Works!";
}
}
我希望保留默认的SDR自动生成端点,只需添加新的自定义方法/新实现。
我怎么能用Spring数据Rest / HATEOAS这个自定义方法?
使用简单@RepositoryRestResource
,控制器端点将自动生成。如果我想提供一些自定义方法怎么办?我认为我必须手动创建控制器,但在这种示例性情况下它应该如何?
答案 0 :(得分:0)
首先,像public String printPerson(PersonNode personNode)
这样的存储库上的这种方法是RPC样式的API,它是一种已知的反模式,因此您应该以符合REST的方式设计API(参见例如{{ 3}})
您的问题的解决方案可能如下所示:
为自定义方法创建一个自定义@RestController
(如您所愿),定义@RequestMapping
,调用相关实现。
为您的实体创建一个新ResourceProcessor
并覆盖其process
方法,添加指向您自定义方法的资源的新链接,例如/people/{id}/printPerson
或您的映射定义是
这是我项目中的一个示例(Blog
实体需要列出其Categories
):
@Component
public static class BlogResourceProcessor implements ResourceProcessor<Resource<Blog>> {
@Override
public Resource<Blog> process(Resource<Blog> blogResource) {
UriComponents uriComponents = ServletUriComponentsBuilder.fromCurrentContextPath()
.path("/blog/{id}/categories").buildAndExpand(Long.toString(blogResource.getContent().getId()));
blogResource.add(new Link(uriComponents.toUriString(), "categories"));
return blogResource;
}
}
答案 1 :(得分:-1)
添加了自定义方法,因此您可以在代码的其他位置使用PersonRepository。它没有神奇地将它映射到REST操作,但现有的PagingAndSortingRepository映射将保留。