gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:58:06 25 4
gpt4 key购买 nike

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

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

这只是一个虚构的例子。想象一个 User 包含一个 Company 对象和适当的 getters/setters。

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

由于就 Spring 而言,属性编辑器已成为过去,因此我们希望使用新的 Conversion Service API。对于我的应用程序,我已经成功地创建了一个工厂,它执行我以前的属性编辑器所做的事情——将 id 转换回实体。

我的问题是,如何让 Spring 在 Jackson 编码 JSON 数据期间或之后调用转换服务?我知道可以创建自定义 JsonDeserializer,但我发现编写/测试这些是一个痛苦且漫长的过程,因为我需要为大量实体执行此操作,并且每个反序列化器都需要每个代码从 60 到 200 行不等。

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

最佳答案

它只会对根对象 User 起作用,在这种情况下它不会对嵌套组件起作用。 Spring Data REST 有一个“DomainClassConverter”,您可以看一下。

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

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

链接

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

关于java - 如何让 Spring 3.2 的 ConversionService 和 HttpMessageConverters 一起为 @RequestBody 注解工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19081360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com