URL-адрес настраиваемого API-интерфейса Spring Data REST для HATEOAS? - PullRequest
0 голосов
/ 11 декабря 2018

Что я знаю:

  1. Если я определю пользовательский метод в интерфейсе репозитория, он будет отображаться в URL-адресе как http://localhost/{repository}/search/{myMethod}.Например, я могу определить метод recent в интерфейсе репозитория Order (я могу сделать это с помощью простого и чистого @Query) и получить самый последний объект с помощью http://localhost/order/search/recent.
  2. Если я использую @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 с минимальными усилиями?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...