JSON到Java映射参数/泛型类型

时间:2013-09-29 23:48:11

标签: java json spring rest jackson

我正在寻找有关处理以下情况的最佳做法的建议。

鉴于基于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>

1 个答案:

答案 0 :(得分:4)

解决方案是声明参数类型并以此方式将其用作@RequestBody的目标:

public class MyCustomTypeContainer extends Container<SubContainerItem>  {
..
}

public void updateContainer(@RequestBody MyCustomTypeContainer container) {
    realService.updateContainer(container);
}

注意,MyCustomTypeContainer必须是参数类型(完全实现的泛型类型)。这可能意味着您可能必须为每个containerItem类型创建一个子类型。

请参阅here以获得同一行的其他问题。