我正在寻找有关处理以下情况的最佳做法的建议。
鉴于基于Java的Web API接受JSON请求,我们需要将JSON对象映射到Java。这个问题是关于Java对象是参数类型的情况。对于我的特定情况,我使用Spring和MappingJacksonHttpMessageConverter来进行映射。
REST服务示例
@RequestMapping(method = RequestMethod.POST)
public void updateContainer(@RequestBody Container<?> container) {
realService.updateContainer(container);
}
参数类型示例
public class Container<T extends ContainerItem> {
private T containerItem;
...
}
当我调用此方法时,我将收到400错误(错误请求),因为Container的类型在运行时被擦除而Jackson不知道如何映射我的containerItem(因为它不知道要映射到哪个类型)
我实现了一个非常基本的解决方案,其中我向JSON数据添加了一个字段,指定了containerItem的Java类名,然后添加了一个自定义的HttpMessageConverter,它使用这个类名来构造一个参数化JavaType,然后Jackson ObjectMapper就可以了用来做映射,但我想知道是否有人有更好的方法来处理它?</ p>
答案 0 :(得分:4)
解决方案是声明参数类型并以此方式将其用作@RequestBody
的目标:
public class MyCustomTypeContainer extends Container<SubContainerItem> {
..
}
public void updateContainer(@RequestBody MyCustomTypeContainer container) {
realService.updateContainer(container);
}
注意,MyCustomTypeContainer
必须是参数类型(完全实现的泛型类型)。这可能意味着您可能必须为每个containerItem类型创建一个子类型。
请参阅here以获得同一行的其他问题。