Что я знаю:
- Если я определю пользовательский метод в интерфейсе репозитория, он будет отображаться в URL-адресе как
http://localhost/{repository}/search/{myMethod}
.Например, я могу определить метод recent
в интерфейсе репозитория Order
(я могу сделать это с помощью простого и чистого @Query) и получить самый последний объект с помощью http://localhost/order/search/recent
. Если я использую @RepositoryRestController
для создания пользовательского класса контроллера, я должен реализовать HATEOAS, используя Resource
и Resources
, и добавить ссылку.Но я получу правильный URL, который я хочу, например http://localhost/{myPath}
.Например, если я хочу получить самые последние объекты Order
, я должен написать следующие коды:
@RepositoryRestController
public class RecentOrdersController {
private OrderRepository orderRepo;
@Autowired
public RecentOrdersController(OrderRepository orderRepo) {
this.orderRepo = orderRepo;
}
@GetMapping(path = "/orders/recent", produces = "application/hal+json")
public ResponseEntity<Resources<OrderResource>> recentOrders() {
PageRequest page = PageRequest.of(
0, 12, Sort.by("createdAt").descending());
List<Order> orders = orderRepo.findAll(page).getContent();
List<OrderResource> orderResources =
new OrderResourceAssembler().toResources(orders);
Resources<OrderResource> recentResources =
new Resources<OrderResource>(tacoResources);
recentResources.add(
linkTo(methodOn(RecentOrdersController.class).recentOrders())
.withRel("recents"));
return new ResponseEntity<>(recentResources, HttpStatus.OK);
}
}
, а затем:
@Bean
public ResourceProcessor<PagedResources<Resource<Order>>>
orderProcessor(EntityLinks links) {
return new ResourceProcessor<PagedResources<Resource<Order>>>() {
@Override
public PagedResources<Resource<Order>> process(
PagedResources<Resource<Order>> resource) {
resource.add(
links.linkFor(Order.class)
.slash("recent")
.withRel("recents"));
return resource;
}
};
}
Я сам должен написать OrderResource
и OrderResourceAssembler
, и это еще хуже, так как в домене Order
может быть много других доменов, таких как Person
, я должен записать xxxResource
и xxxResourceAssembler
Я тоже.
Мой вопрос: как я могу их объединить?
Например, если я определяю класс домена с именем Order
и включаю REST данных источника, как я могу получить наибольшеепоследние заказы через URL, такие как http://localhost/recent
с полной поддержкой HATEOAS с минимальными усилиями?