Ich habe WebDeviceInfo
und IOSDeviceInfo
Klassen, die Unterklassen von DeviceInfo
sind. Wie kann ich einen einzelnen Endpunkt in einer Quelle erstellen, die entweder IOSDeviceInfo
oder WebDeviceInfo
akzeptiert?Akzeptieren Sie zwei verschiedene Unterklassen mit demselben @RequestMapping
Versuch # 1
Ich habe versucht, die gleichen RequestMapping
auf zwei verschiedene Methoden zur Karte, eine, die, wenn die RequestBody
könnte zu einem WebDeviceInfo
und das andere abgebildet werden erhalten genannt würde, die, wenn die RequestBody
aufgerufen würde könnte auf eine IOSDeviceInfo
gemappt werden.
@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
}
Aber das funktioniert nicht, die zweiten RequestMapping
nicht registrieren lassen und die Anwendung nicht starten, weil Frühling sieht, dass /register-device
mit den gleichen RequestMethod
und MediaType
bereits einem anderen Verfahren abgebildet wird.
Versuch # 2
Als nächstes habe ich versucht, die übergeordnete Klasse als RequestBody
zu akzeptieren und dann auf die entsprechende Unterklasse Gießen.
@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");
}
}
Dies funktioniert auch nicht. Ich habe immer bekommen:
Could not cast deviceInfo to WebDeviceInfo or IOSDeviceInfo
Versuch # 3
Schließlich habe ich versucht, Gießen nur auf die richtige Unterklasse innerhalb eines try
/catch
.
@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");
}
}
}
Wieder erhalte ich Fehler:
Could not cast deviceInfo to WebDeviceInfo or IOSDeviceInfo
Gibt es eine Möglichkeit, dies zu erreichen, oder werde ich zwei verschiedene Methoden mit zwei verschiedenen RequestMapping
s zu schaffen haben?
es auf diese Weise nicht funktioniert, müssen Sie Ihre httpMssagerConverter zu 'deserialize' die HTTP-Anforderung zu erweitern, die sollte sehr einfach sein, wenn Sie 'jackson' verwenden – Jaiwo99
Wie sollte Spring MVC entscheiden, den Inhalt für den zweiten und dritten Versuch entweder als' IOSDeviceInfo' oder als 'WebDeviceInfo' zu deserialisieren? –
@ Jaiwo99 Haben Sie ein Beispiel dafür, wie Sie den Standard, den Spring bietet, außer Kraft setzen? –