Комбинированное сопоставление с Spring Data JPA и Feign

У меня есть МагазинМикроСервис, КлиентМикроСервис и КорзинаМикроСервис.

ShopMicroService должен работать как шлюз API и иметь возможность контролировать все остальные службы. Они подключены и маршрутизируются с помощью Netflix Zuul.

Я хочу иметь возможность звонить, например. localhost:8080/list и просматривать данные как из CustomerMicroService, так и из CartMicroService. Но я также не могу вернуть два метода в моем ShopController. Как я могу обойти это?

Shop2CartConnector:

@FeignClient("cartmicroservice")
public interface Shop2CartConnectorRequester {

    @GetMapping("/list")
    public List<?> getCart();

Shop2CustomerConnector:

@FeignClient("customermicroservice")
public interface Shop2CustomerConnectorRequester {

    @GetMapping("/list")
    public List<?> getCustomer();

МагазинКонтроллер:

@ComponentScan
@RestController
public class ShopController {

    final Shop2CustomerConnectorRequester shop2CustomerConnectorRequester;
    final Shop2CartConnectorRequester shop2CartConnectorRequester;

    @Autowired
    public ShopController(Shop2CustomerConnectorRequester shop2CustomerConnectorRequester,
            Shop2CartConnectorRequester shop2CartConnectorRequester) {
        this.shop2CustomerConnectorRequester = shop2CustomerConnectorRequester;
        this.shop2CartConnectorRequester = shop2CartConnectorRequester;

    }

    @GetMapping("/getCustomer")
    public List<?> getCustomer() {
        return shop2CustomerConnectorRequester.getCustomer();

    }

    @GetMapping("/getCart")
    public List<?> getCart() {
        return shop2CartConnectorRequester.getCart();

    }

Я уже пытался вызвать только один метод и использовать оба метода, но он по-прежнему показывает, конечно, только список, который я возвращаю.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По сути, когда вы делаете вызов API, request handler вашего приложения будет направлять входящие HTTPS-запросы на определенные методы обработчиков ваших контроллеров. Следовательно, вы не можете «вернуть два метода».

Но, если я вас правильно понял, вы хотите объединить два списка и вернуть их клиенту - поправьте меня, если я ошибаюсь :) Для этого вы можете использовать Stream API, который предоставляет метод concat. Например

@RestController
public class ShopController {

    final Shop2CustomerConnectorRequester shop2CustomerConnectorRequester;
    final Shop2CartConnectorRequester shop2CartConnectorRequester;

    @Autowired
    public ShopController(Shop2CustomerConnectorRequester shop2CustomerConnectorRequester,
            Shop2CartConnectorRequester shop2CartConnectorRequester) {
        this.shop2CustomerConnectorRequester = shop2CustomerConnectorRequester;
        this.shop2CartConnectorRequester = shop2CartConnectorRequester;

    }

   @GetMapping("/listAll")
   public List getAllLists() {
       List<Customer> customerList = hop2CustomerConnectorRequester.getCustomer();
       List<Cart> cartList = hop2CartConnectorRequester.getCart();

       List<?> list =  Stream.concat(customerList.stream(), cartList.stream()).collect(Collectors.toList());

       return list;
   }

Но я бы рекомендовал использовать объект-оболочку для возврата двух разных типов объектов, а не возвращать их в один список. Вы можете столкнуться с проблемами при извлечении объектов из списка, объекты которых не принадлежат одной и той же реализации (приведение типов и т. д.).

Другие вопросы по теме