Примите два разных подкласса с одинаковым @RequestMappingJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Примите два разных подкласса с одинаковым @RequestMapping

Сообщение Anonymous »

У меня есть классы WebDeviceInfo и IOSDeviceInfo, которые являются подклассами DeviceInfo. Как я могу создать одну конечную точку в Spring @RestController, которая будет принимать IOSDeviceInfo или WebDeviceInfo?
Попытка № 1< /strong>
Я пытался сопоставить один и тот же RequestMapping с двумя разными методами, один из которых вызывался бы, если RequestBody можно было сопоставить с WebDeviceInfo и другой, который был бы вызван, если бы RequestBody можно было сопоставить с IOSDeviceInfo.

Код: Выделить всё

@RequestMapping(value = "/register-device", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void registerWebDevice(@RequestBody final WebDeviceInfo webDeviceInfo) {
//register web device
}

@RequestMapping(value = "/register-device", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void registerIOSDevice(@RequestBody final IOSDeviceInfo iosDeviceInfo) {
//register ios device
}
Но это не работает, второй RequestMapping не регистрируется, и приложение не запускается, потому что Spring видит это /register-device с тот же RequestMethod и MediaType уже сопоставлен другому методу.
Попытка № 2[/b]
Далее я попробовал принять суперкласс как RequestBody и затем преобразовать его в соответствующий подкласс.

Код: Выделить всё

@RequestMapping(value = "/register-device", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void registerDevice(@RequestBody final DeviceInfo deviceInfo) {
if (deviceInfo instanceof WebDeviceInfo) {
final WebDeviceInfo webDeviceInfo = (WebDeviceInfo) deviceInfo;
//register web device
} else if (deviceInfo instanceof IOSDeviceInfo) {
final IOSDeviceInfo iosDeviceInfo = (IOSDeviceInfo) deviceInfo;
//register ios device
} else {
logger.debug("Could not cast deviceInfo to WebDeviceInfo or IOSDeviceInfo");
}
}
Это тоже не работает. Я всегда получаю:

Не удалось привести данные устройства к WebDeviceInfo или IOSDeviceInfo

Попытка №3
Наконец, я попробовал просто выполнить приведение к правильному подклассу внутри попытки/.

Код: Выделить всё

@RequestMapping(value = "/register-device", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void registerDevice(@RequestBody final DeviceInfo deviceInfo) {
try {
final WebDeviceInfo webDeviceInfo = (WebDeviceInfo) deviceInfo);
//register web device
} catch (final ClassCastException ex) {
try {
final IOSDeviceInfo iosDeviceInfo = (IOSDeviceInfo) deviceInfo);
//register ios device
} catch (final ClassCastException ex2) {
logger.debug("Could not cast deviceInfo to WebDeviceInfo or IOSDeviceInfo");
}
}
}
Снова получаю сообщение об ошибке:

Не удалось привести данные устройства к WebDeviceInfo > или IOSDeviceInfo

Есть ли какой-нибудь способ добиться этого, или мне придется создать два отдельных метода с двумя разными RequestMapping< /code>s?

Подробнее здесь: https://stackoverflow.com/questions/440 ... estmapping
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»