问题描述
我想将自定义搜索端点添加到我现有的用户存储库.
I would like to add a custom search endpoint to my existing user repository.
我的用户存储库如下所示:
My user Repository looks like this:
@RepositoryRestResource(collectionResourceRel="users", path="users") public interface UserRepository extends PagingAndSortingRepository<User, Long>{ User findByUsername(String username); }
自定义控制器:
@BasePathAwareController @RequestMapping("users/search") public class CustomController implements ResourceProcessor<RepositorySearchesResource>, ResourceAssembler<User, Resource<User>> { @Autowired UserRepository userReposiotry; @Autowired private EntityLinks entityLinks; @RequestMapping(value = "findFirst", produces = "application/json") @ResponseBody public ResponseEntity<Resource<User>> findFirstUser() { Resource<User> resource = toResource(userReposiotry.findOne(1L)); return new ResponseEntity<Resource<User>>(resource, HttpStatus.OK); } @Override public RepositorySearchesResource process(RepositorySearchesResource resource) { LinkBuilder lb = entityLinks.linkFor(User.class, "username"); resource.add(new Link(lb.toString() + "/search/findFirst", "findFirst")); return resource; } @Override public Resource<User> toResource(User user) { Resource<User> resource = new Resource<User>(user); return resource; } }
这将为用户返回正确的搜索端点:
This returns the correct search endpoint for the users:
{ "_links": { "findByUsername": { "href": "http://localhost:8080/api/users/search/findByUsername" }, "self": { "href": "http://localhost:8080/api/users/search" }, "findFirst": { "href": "http://localhost:8080/api/users/search/findFirst", "templated": true } } }
但也适用于邀请等其他端点:
But also for other endpoints like Invites:
{ "_links": { "findUserByInvite": { "href": "http://localhost:8080/api/invites/search/findUserByInvite" }, "self": { "href": "http://localhost:8080/api/invites/search" }, "findFirst": { "href": "http://localhost:8080/api/invites/search/findFirst", "templated": true } } }
这怎么能仅限于用户?谢谢
How can this be restricted to the users only? Thanks
推荐答案
我假设您的邀请端点也返回一个 RepositorySearchesResource ?!每当 spring-data-rest 序列化 RepositorySearchesResource 时,都会调用您的 ResourceProcessor.如果您想为用户和邀请提供不同的链接,您有一些选择:
I assume your invites endpoint also returns a RepositorySearchesResource ?! Your ResourceProcessor is invoked whenever spring-data-rest serializes a RepositorySearchesResource. If you want different links for users and invites you have some alternatives:
- 为您的搜索端点使用不同的返回类型,以便您可以有不同的 ResourceProcessor 实现
- 在您的 ResourceProcessor 中添加更多逻辑,以区分您是在邀请还是用户用例中
- use different return types for your search endpoints so you can have different ResourceProcessor implementations
- put more logic inside your ResourceProcessor to differentiate if you are in your invites or users use case