2015-12-01 3 views
1

Я хотел бы добавить конечную точку пользовательского поиска в мой существующий репозиторий пользователей.Spring Data Rest Добавить пользовательскую конечную точку в конкретную репозиторию

Мой пользователь Repository выглядит следующим образом:

@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 
    } 
    } 
} 

Как это можно ограничить только для пользователей? Спасибо

ответ

1

Я предполагаю, что ваши приглашения оконечная точка также возвращает RepositorySearchesResource?! Ваш ResourceProcessor вызывается всякий раз, когда весна-данные-отдых сериализует RepositorySearchesResource. Если вы хотите различные ссылки для пользователей и приглашает вас есть несколько вариантов:

  • использовать различные типы возврата для поиска конечных точек, так что вы можете иметь различные ResourceProcessor реализации
  • положить больше логики внутри ResourceProcessor дифференцироваться, если вы находитесь в ваши круги или пользователи используют случай
+0

Привет, Приглашение такое же, как интерфейс userRepository. Используя второе предложение, мне удалось это сделать, добавив \t if (resource.getDomainType() == User.class) в мой процесс RepositorySearchesResource. Но мне было интересно, есть ли лучший способ сделать это? благодаря – user1601401

Смежные вопросы