Вместо создания оператора 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.
@SotiriosDelimanolis Простите за это. Я бы предложил взять строку в качестве ввода (приветствие, адрес) и инициализировать соответствующий класс, используя подход фабричного шаблона.
@MaruthiAdithya Откуда взялась эта строка?
@SotiriosDelimanolis Эта строка должна исходить от клиента.
@MaruthiAdithya Предположительно Address уже идет от клиента. Как / где они включены?
@SotiriosDelimanolis Как насчет использования @RequestParam?
@MaruthiAdithya Теперь мы кое-что получим. Если бы они действительно использовали параметр запроса, у них могло бы быть два метода @PostMapping, где аннотация содержит элемент params, различающий эти два типа.
@SotiriosDelimanolis Да, также, если мы сможем сделать этот params обязательным, т.е. required=true, тогда мы можем избежать двух методов @PostMapping и сделать их одним и инициализировать требуемый класс с помощью шаблона Factory и вернуть соответствующую строку в качестве вывода.
Отдых просто не работает ...
Всем спасибо за комментарии. В некоторых случаях будет Приветствие, а в других - Адрес. Цель состоит в том, чтобы дать одну конечную точку, одну дыру в брандмауэре безопасности и иметь возможность разместить бизнес-логику во внешнем приложении.
@TimoReymann .. Помогает ли то, что два запроса приходят в разное время? И, да, я знаю, что Rest работает не так, но подумайте об этом, все промежуточные приложения могут предоставлять одну конечную точку перехвата всех, которая может принимать разные объекты. Одноточечный интерфейс с тесно связанной серверной частью Java.
@ ahkar5 Один из вариантов - выбрать тип на основе заголовка content-type / accept. Как приложение / vnd + company.BODYTYPENAME + json. Таким образом вы можете сопоставить его на основе Content-Type




Это возможно нет. Это неоднозначно.
Хорошая практика состоит в том, что если два ресурса будут обрабатывать данные по-разному, вы должны создать разные конечные точки для каждого из них.
Или возможный обходной путь для вас: создать объект ViewModel и обработать его одним методом.
public class GreetingAddressVM {
private Address address;
private Greeting greeting;
}
Я бы предпочел создавать разные сопоставления для каждого действия.
Неужели это невозможно? Я надеюсь, что в будущем эта функция станет возможной.
Да, но я не думаю, что это будет доступно, может вызвать путаницу и будет довольно сложно поддерживать, я полагаю
@MaruthiAdithya Уточните, пожалуйста. Для меня это не имеет смысла. Им нужна одна конечная точка, которая может обрабатывать оба типа данных.