[英]Spring Data Rest Add custom endpoint to specific reposiotry
我想將自定義搜索端點添加到我現有的用戶存儲庫。
我的用戶存儲庫如下所示:
@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;
}
}
這將為用戶返回正確的搜索端點:
{
"_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
}
}
}
但也適用於其他端點,如邀請:
{
"_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
}
}
}
這怎么能僅限於用戶? 謝謝
我假設您的邀請端點也返回一個RepositorySearchesResource
?! 每當 spring-data-rest 序列化RepositorySearchesResource
時,就會調用您的ResourceProcessor
。 如果您希望為用戶和邀請提供不同的鏈接,您有一些選擇:
ResourceProcessor
實現ResourceProcessor
放置更多邏輯以區分您是否在邀請或用戶用例中另一種方法是使用 ResponseBodyAdvice。
@ControllerAdvice
public class AllEntityBodyAdvice implements ResponseBodyAdvice {
@Override
public boolean supports(@NonNull MethodParameter returnType, @NonNull Class converterType) {
System.out.println("In supports() method of " + getClass().getSimpleName());
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
System.out.println("In beforeBodyWrite() method of " + getClass().getSimpleName());
if (Objects.equals(request.getMethod(), HttpMethod.GET)) {
// do sth
}
return body;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.