繁体   English   中英

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

[英]How to get Spring 3.2's ConversionService and HttpMessageConverters to work together for @RequestBody annotation?

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

现在,在Ajax的处理方式中,我们有类似的要求。 而不是使用表单支持对象,我们希望对User对象进行HTTP POST或PUT作为JSON数据,并让Spring代表我们自动将JSON转换为User对象。 Spring通过@RequestBody批注以及使用Jackson来回将JSON编组到Java对象中,使这成为可能。

这只是一个虚构的例子。 想象一个User其中包含一个带有适当的获取器/设置器的Company对象。

@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void create(@Valid @RequestBody User user) {
    userService.saveUser(user);
}

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

我的问题是,在Jackson封送JSON数据期间或之后,如何让Spring调用转换服务? 我知道可以创建一个自定义JsonDeserializer ,但是我发现编写/测试它们是一个痛苦而漫长的过程,因为我需要对大量实体进行此操作,每个反序列化器将花费60到200行每个编码。

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

在这种情况下,它将仅适用于根对象User ,而不适用于嵌套组件。 Spring Data REST有一个`DomainClassConverter',您可以看一下。

基本上,您想创建ConditionalGenericConverter来检查它是否可以转换请求的对象(即EntityManager / SessionFactory是否可以加载它)。 (非条件版本在这里

这与REST(基本上)在服务器端进行查找有些矛盾,因为您应该发送请求所需的所有内容(代表性状态传输和超媒体作为所有状态的传输引擎)。 但这是另一个讨论:)。

链接

  1. 域实体转换器博客
  2. 弹簧参考指南

Deinum先生的回答很好。 但是对于实际工作,请考虑一下AOP;)在您的问题中使用它可能会很有趣:)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM