서브 클래스가 DeviceInfo
인 WebDeviceInfo
과 IOSDeviceInfo
클래스가있다. @RestController
봄에 단일 끝점을 만들려면 IOSDeviceInfo
또는 WebDeviceInfo
중 하나를 받아 들일 수 있습니까?@RequestMapping이 동일한 두 개의 다른 서브 클래스를 받아 들인다.
시도 # 1
은 내가 RequestBody
가 WebDeviceInfo
하고 전화를받을 것이라고 다른 매핑 할 수 있다면 전화를받을 것 하나 같은 RequestMapping
에 두 가지 방법을지도하려고 한 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
}
하지만이 작동하지 않는, 제 2 RequestMapping
등록 및 응용 프로그램은 봄 같은 RequestMethod
및 MediaType
와 /register-device
이미 다른 방법으로 매핑되는 것을 볼 수 있기 때문에 시작되지되지 않습니다.
시도 # 2
다음에, I는 해당 서브 클래스로 캐스팅 한 후 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
내부의 정확한 서브 클래스로 캐스팅했습니다.
Could not cast deviceInfo to WebDeviceInfo or IOSDeviceInfo
이러한 목표를 달성하기 위해 어떤 방법이 있나요, 아니면 두 가지 RequestMapping
의 두 개의 별도의 방법을 만들어야 할 것입니다 :
@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");
}
}
}
다시 나는 오류가 얻을?
, 당신은'당신의 httpMssagerConverter을 확장 할 필요가 HTTP 요청, deserialize'하는 'jackson '을 사용하는 경우 매우 쉽습니다. – Jaiwo99
두 번째 및 세 번째 시도에서 Spring MVC가 콘텐츠를'IOSDeviceInfo '또는'WebDeviceInfo '로 역 직렬화하도록 결정하는 방법은 무엇입니까? –
@ Jaiwo99 Spring이 제공하는 기본 설정을 덮어 쓰는 방법에 대한 예가 있습니까? –