Java 如何获得Spring 3.2';s ConversionService和HttpMessageConverters是否要为@RequestBody注释一起工作?

Java 如何获得Spring 3.2';s ConversionService和HttpMessageConverters是否要为@RequestBody注释一起工作?,java,ajax,json,spring,spring-mvc,Java,Ajax,Json,Spring,Spring Mvc,在AJAX流行之前,通过使用自定义属性编辑器并在控制器中注册,可以在id和实体之间进行转换。因此,如果您有一个User表单支持对象,其中包含一个Company,如果Company.id为5,Spring将调用您的自定义属性编辑器,以便您可以获取id为5的公司,并将其设置到您的User.Company属性上 现在在Ajax方式下,我们有类似的需求。我们不想使用表单支持对象,而是希望将用户对象作为JSON数据进行HTTP POST或PUT,并让Spring代表我们自动将该JSON转换为用户对象。Sp

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

现在在Ajax方式下,我们有类似的需求。我们不想使用表单支持对象,而是希望将
用户
对象作为JSON数据进行HTTP POST或PUT,并让Spring代表我们自动将该JSON转换为用户对象。Spring通过
@RequestBody
注释,并通过使用Jackson将JSON来回打包到Java对象,实现了这一点

这只是一个虚构的例子。假设一个
用户
包含一个
公司
对象,该对象具有适当的getter/setter

@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void create(@Valid @RequestBody User user) {
    userService.saveUser(user);
}
因为就Spring而言,属性编辑器已经成为过去,所以我们希望使用新的转换服务API。对于我的应用程序,我已经成功创建了一个工厂,它完成了我以前的属性编辑器所做的工作——将id转换回实体

我的问题是,如何让Spring在Jackson封送JSON数据期间或之后调用转换服务?我知道可以创建一个定制的
JsonDeserializer
,但我发现编写/测试这些是一个痛苦而漫长的过程,因为我需要为大量的实体这样做,每个反序列化程序都需要60到200行代码


我希望Spring能够代表我做id到实体的映射,就像它对表单支持对象所做的那样。有办法吗?

它只对根对象
用户起作用,在这种情况下,它对嵌套组件不起作用。SpringDataREST有一个“DomainClassConverter”,您可以查看它

基本上,您希望创建
ConditionalGenericConverter
,检查它是否可以转换请求的对象(即它是否可以由
EntityManager
/
会话工厂加载)。(无条件版本为

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

链接

  • 域实体转换器

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

    只是为了让我正确理解:您的处理程序方法(用
    @RequestBody
    注释)返回一个
    用户
    对象。您能否显示您的
    用户
    类和
    公司
    类以及预期的输出?返回类型实际上并不相关,因为使用Jackson将数据封送回客户端往往会按预期工作。问题是数据何时进入控制器。假设我有一个JSON,它有一个嵌套公司的用户。Json中的company.id是5。我希望Spring足够聪明,能够在它到达控制器之前,使用我的
    ConverterServiceFactory
    来获取该公司。我可以使用
    JsonDeserializer
    ,但是如果我能帮助的话,我想避免大量的手动管道。因此JSON包含
    id
    ,但是您希望反序列化程序实际从一些
    数据源
    获取对象,并使用它来构建
    用户
    对象?是的!)我们以前对表单支持对象进行过此操作,没有问题。这个问题与@RequestBody非常相似。我希望得到相同类型的行为,即使技术问题有点不同。