spring 4 controller @RequestBody参数

时间:2016-01-27 15:50:35

标签: java spring spring-mvc

我有以下情况

public class MyCustomForm {
  private MyCustomType a;
  private MyCustomType b;
}

@RestController
public class AController {
  @RequestMapping(...)
  public void myMethod(@RequestBody MyCustomForm form){
    ...
  }
}

我想在POST请求中发送填写表单的必要数据。问题是MyCustomType是一种复杂的数据类型,无法从JSON反序列化。

我尝试的第一件事是编写一个PropertyEditor,以便Spring知道如何从字符串中进行反序列化。如果我使用@RequestBody旁边的任何其他内容(例如,它适用于@PathVariable),则此解决方案有效。

我进行了一些研究,@RequestBody不起作用的原因是因为这个注释生成了一个使用自己的反序列化规则的代理。这些规则不会干扰自定义PropertyEditor

我接下来尝试的是使用自定义Converter。这个解决方案仍然没有解决问题。

还有其他想法吗?

据我所知,最新版本的jackson(版本2)将了解自定义ConverterPropertyEditor,但更新我的杰克逊映射器在我的情况下并不是真正的解决方案。

1 个答案:

答案 0 :(得分:3)

您可以将@JsonDeserialize用于MyCustomType

public class MyCustomForm {
  @JsonDeserialize(using = MyCustomTypeDeserializer.class)
  private MyCustomType a;
  @JsonDeserialize(using = MyCustomTypeDeserializer.class)
  private MyCustomType b;
}

一些参考文献:

https://fasterxml.github.io/jackson-databind/javadoc/2.3.0/com/fasterxml/jackson/databind/annotation/JsonDeserialize.html

http://www.davismol.net/2015/06/05/jackson-using-jsonserialize-or-jsondeserialize-annotation-to-register-a-custom-serializer-or-deserializer/

http://www.baeldung.com/jackson-custom-serialization