1

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

给定一个接受 JSON 请求的基于 Java 的 Web API,我们需要将 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 然后可以使用它来做映射,但我想知道是否有人有更好的方法来处理这个?

4

1 回答 1

4

一个解决方案是声明一个参数类型并将其用作@RequestBody这种方式的目标:

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

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

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

请参阅此处了解另一个相同的问题。

于 2013-09-30T01:00:54.207 回答