Несколько объектов Java на одной конечной точке

Вместо создания оператора case для моего Spring Boot Rest Controller я хочу, чтобы Spring использовал правильную конечную точку. Я даже не уверен, что это возможно, но надеюсь, что Вселенная может меня спасти.

  @PostMapping("/endpoint")
    public String one(Greeting greet) {
        return "Greeting Posted";

    }

    @PostMapping("/endpoint")
    public String two(Address addr) {
        return "Address Posted";

    }

Текущая ошибка

Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'RController' method 
public java.lang.String com.example.controller.RController.two(com.example.model.Address)
to {[/endpoint],methods=[POST]}: There is already 'RController' bean method
public java.lang.String com.example.controller.RController.one(com.example.model.Greeting) mapped.

@MaruthiAdithya Уточните, пожалуйста. Для меня это не имеет смысла. Им нужна одна конечная точка, которая может обрабатывать оба типа данных.

Sotirios Delimanolis 17.09.2018 18:19

@SotiriosDelimanolis Простите за это. Я бы предложил взять строку в качестве ввода (приветствие, адрес) и инициализировать соответствующий класс, используя подход фабричного шаблона.

Maruthi Adithya 17.09.2018 18:37

@MaruthiAdithya Откуда взялась эта строка?

Sotirios Delimanolis 17.09.2018 18:39

@SotiriosDelimanolis Эта строка должна исходить от клиента.

Maruthi Adithya 17.09.2018 18:41

@MaruthiAdithya Предположительно Address уже идет от клиента. Как / где они включены?

Sotirios Delimanolis 17.09.2018 18:41

@SotiriosDelimanolis Как насчет использования @RequestParam?

Maruthi Adithya 17.09.2018 18:43

@MaruthiAdithya Теперь мы кое-что получим. Если бы они действительно использовали параметр запроса, у них могло бы быть два метода @PostMapping, где аннотация содержит элемент params, различающий эти два типа.

Sotirios Delimanolis 17.09.2018 18:44

@SotiriosDelimanolis Да, также, если мы сможем сделать этот params обязательным, т.е. required=true, тогда мы можем избежать двух методов @PostMapping и сделать их одним и инициализировать требуемый класс с помощью шаблона Factory и вернуть соответствующую строку в качестве вывода.

Maruthi Adithya 17.09.2018 18:49

Отдых просто не работает ...

Timo Reymann 17.09.2018 21:55

Всем спасибо за комментарии. В некоторых случаях будет Приветствие, а в других - Адрес. Цель состоит в том, чтобы дать одну конечную точку, одну дыру в брандмауэре безопасности и иметь возможность разместить бизнес-логику во внешнем приложении.

ahkar5 17.09.2018 22:06

@TimoReymann .. Помогает ли то, что два запроса приходят в разное время? И, да, я знаю, что Rest работает не так, но подумайте об этом, все промежуточные приложения могут предоставлять одну конечную точку перехвата всех, которая может принимать разные объекты. Одноточечный интерфейс с тесно связанной серверной частью Java.

ahkar5 17.09.2018 22:09

@ ahkar5 Один из вариантов - выбрать тип на основе заголовка content-type / accept. Как приложение / vnd + company.BODYTYPENAME + json. Таким образом вы можете сопоставить его на основе Content-Type

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

Ответы 1

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

Это возможно нет. Это неоднозначно.

Хорошая практика состоит в том, что если два ресурса будут обрабатывать данные по-разному, вы должны создать разные конечные точки для каждого из них.

Или возможный обходной путь для вас: создать объект ViewModel и обработать его одним методом.

public class GreetingAddressVM {

    private Address address;

    private Greeting greeting;

}

Я бы предпочел создавать разные сопоставления для каждого действия.

Неужели это невозможно? Я надеюсь, что в будущем эта функция станет возможной.

ahkar5 18.09.2018 18:25

Да, но я не думаю, что это будет доступно, может вызвать путаницу и будет довольно сложно поддерживать, я полагаю

Deividi Cavarzan 18.09.2018 22:23

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