2015-12-20 6 views
3

Учитывая Custom implementations for Spring Data repositories Я использую @RepositoryRestResource на хранилище, чтобы принести все HATEOAS сгенерированные GoodNES:Spring Data Rest/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-data Rest/HATEOAS? С простыми @RepositoryRestResource конечные точки контроллера автогенерируются. Что делать, если я хочу предоставить некоторые пользовательские методы? Я предполагаю, что мне придется создавать контроллер вручную, но как он должен выглядеть в этом примерном случае?

ответ

0

Пользовательский метод добавлен, чтобы вы могли использовать его в своем коде в другом месте, где вы бы использовали PersonRepository. Это не волшебным образом отображает его в REST-операции, но существующие сопоставления PagingAndSortingRepository останутся.

0

Прежде всего, такой метод в хранилище как public String printPerson(PersonNode personNode) это стиль RPC API и это известный анти-модель, так что вы должны создать свой API в REST-совместимым-способом (смотри, например, How to design REST API for non-CRUD "commands" like activate and deactivate of a resource?)

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

  1. Создание пользовательского @RestController (как вы предполагаете) с определенными @RequestMapping с для пользовательских методов, которые требуют соответствующих реализаций.

  2. Создать новую 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; 
    } 
} 
Смежные вопросы