gpt4 book ai didi

spring - 框架未使用自定义 Spring HttpMessageConverter

转载 作者:行者123 更新时间:2023-12-04 14:25:15 24 4
gpt4 key购买 nike

我有一个 Spring mvc @RestController 类,其中方法参数用 @RequestBody 注释。像这样:

@RestController
@RequestMapping("/features")
public class FeatureController {

@PostMapping
public Feature createFeature(@RequestBody Feature feature) {
......
}
}

我的 Feature 类有一个使用 Builder 模式构建的私有(private)构造函数。所以我创建了名为 FeatureConverterHttpMessageConverter 并使用 extendMessageConverters 正确注册了它。转换器使用 Jackson 解析 JSON,然后使用 Feature.Builder 创建 Feature 的实例。

我的问题是 Spring 在我的自定义 FeatureConverter 之前注册了一个 MappingJackson2HttpMessageConverter 的实例。结果,MappingJackson2HttpMessageConverter 尝试解析,甚至在到达 FeatureConverter 之前。由于构造函数是私有(private)的,因此 MappingJackson2HttpMessageConverter 失败。

我的问题是如何更改顺序,以便在 MappingJackson2HttpMessageConverter 之前询问 FeatureConverter。有正确的方法吗?

最佳答案

Spring MVC WebMvcConfigurerAdapter 像这样初始化 HttpMessageConverters:

protected final List<HttpMessageConverter<?>> getMessageConverters() {
if (this.messageConverters == null) {
this.messageConverters = new ArrayList<HttpMessageConverter<?>>();
configureMessageConverters(this.messageConverters);
if (this.messageConverters.isEmpty()) {
addDefaultHttpMessageConverters(this.messageConverters);
}
extendMessageConverters(this.messageConverters);
}
return this.messageConverters;
}

参见:Github - WebMvcConfigurationSupport

如您所见,有 3 种方法:

  1. configureMessageConverters,默认为空,这是你应该添加转换器的地方
  2. addDefaultHttpMessageConverters,顾名思义,这里会创建所有默认转换器,默认的 MappingJackson2HttpMessageConverter 会在那里创建。
  3. extendMessageConverters 作为文档:

Override this method to extend or modify the list of converters after it has been configured. This may be useful for example to allow default converters to be registered and then insert a custom converter through this method.

在添加所有默认转换器后想要修改列表时使用。

要回答您的问题,如果您不需要默认转换器,您只需覆盖 configureMessageConverters 并添加它:

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new FeatureConverter());
}

如果您需要它们,您可以复制粘贴 addDefaultHttpMessageConverters 内容并将其添加到 configureMessageConverters 中,然后按照初始化顺序进行操作(丑陋的解决方案)。

否则,您可以使用 extendMessageConverters 在默认初始化后添加它并播放顺序:

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(the_index_you_want, new FeatureConverter());
}

关于spring - 框架未使用自定义 Spring HttpMessageConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47039330/

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