我有WebDeviceInfo
和IOSDeviceInfo
類是DeviceInfo
的子類。如何在彈簧@RestController
中創建單個端點,以接受IOSDeviceInfo
或WebDeviceInfo
?接受兩個不同的子類具有相同的@RequestMapping
嘗試#1
我試圖映射相同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
沒有得到註冊和應用程序無法啓動,因爲春天是看到與/register-device
相同RequestMethod
和MediaType
已被映射到另一種方法。
嘗試#2
接着,我試圖接受超類作爲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");
}
}
這也行不通。我總是得到:
Could not cast deviceInfo to WebDeviceInfo or IOSDeviceInfo
嘗試3
最後,我試着只是投放到正確的子類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");
}
}
}
我再次得到錯誤:
Could not cast deviceInfo to WebDeviceInfo or IOSDeviceInfo
有沒有辦法做到這一點,還是我將不得不創建兩個單獨的方法有兩種不同的RequestMapping
S'
它不以這種方式工作,你需要你的httpMssagerConverter延伸到'deserialize' http請求,這應該很容易,如果你使用'jackson' – Jaiwo99
對於第二次和第三次嘗試,Spring MVC應該如何決定將內容反序列化爲「IOSDeviceInfo」還是「WebDeviceInfo」? –
@ Jaiwo99你有沒有關於如何重寫Spring提供的默認示例的示例? –