如何让Spring 3.2的ConversionService和HttpMessageConverters一起工作以进行@RequestBody注释?

时间:2013-09-29 17:57:38

标签: java ajax json spring spring-mvc

在AJAX流行之前,可以通过使用自定义属性编辑器并在控制器中注册它来在id和实体之间进行转换。因此,如果您的User表单支持对象包含Company,如果company.id为5,则Spring会调用您的自定义属性编辑器,以便您可以使用id {获取公司{1}}并将其设置为5属性。

现在以Ajax的方式做事,我们有类似的要求。我们不想使用表单支持对象,而是希望将user.company对象的HTTP POST或PUT作为JSON数据,并让Spring代表我们自动将该JSON转换为User对象。 Spring使User注释成为可能,并使用Jackson将JSON来回传递给Java对象。

这只是一个虚构的例子。想象一个@RequestBody包含一个User对象和适当的getter / setter。

Company

因为就Spring而言,属性编辑器已成为过去,我们应该使用新的Conversion Service API。对于我的应用程序,我已成功创建了一个工厂,它可以执行我以前的旧属性编辑器所做的工作 - 将id转换回实体。

我的问题是,如何在杰克逊编组JSON数据期间或之后让Spring调用转换服务?我知道可以创建一个自定义@RequestMapping(method = RequestMethod.POST) @ResponseStatus(HttpStatus.NO_CONTENT) public void create(@Valid @RequestBody User user) { userService.saveUser(user); } ,但我发现编写/测试这些是一个痛苦而漫长的过程,因为我需要为大量实体执行此操作,并且每个反序列化器将需要60每行200行代码。

如果Spring可以代表我为我做实体映射的id,就像它对表单支持对象所做的那样,我会喜欢它。有办法吗?

2 个答案:

答案 0 :(得分:0)

它只能在根对象User中起作用,在这种情况下它不适用于嵌套组件。 Spring Data REST有一个`DomainClassConverter',你可以看一下。

基本上你想创建ConditionalGenericConverter来检查它是否可以转换请求的对象(即它可以由EntityManager / SessionFactory加载)。 (非条件版本为here

这一切都有点反对REST(基本上)在服务器端进行查找,因为您应该发送请求所需的一切(Representational State Transfer和Hypermedia作为所有状态的传输引擎)。但这是另一个讨论:)。

链接

  1. 域实体转换器blog
  2. Spring Reference guide

答案 1 :(得分:0)

M. Deinum的答案很棒。 但是对于实际工作,请考虑AOP;) 在你的问题中使用它会很有趣:)。