java Sping Boot 配置两个MappingJackson2HttpMessageConverter示例

bkkx9g8r  于 2023-06-04  发布在  Java
关注(0)|答案(2)|浏览(302)

我遇到了新创建的Sping Boot 应用程序的问题。出于某种原因,something 正在向Spring Web MVC的返回值处理添加 * 两个 * MappingJackson2HttpMessageConverter示例(我使用调试器发现了这一点)。其中一个使用我通过配置类中的@Bean方法创建的ObjectMapper示例,另一个使用其他随机示例。因此,第二个ObjectMapper是完全未配置的,我的ObjectMapper配置没有应用到@ResponseBody使用的JSON序列化。
我怎样才能停止这种重复?你可以在下面找到我的所有代码。

  • 编辑:* 这个问题与我的自定义ObjectMapper bean无关。即使我删除了它(除了@SpringBootApplication之外完全是空的配置),我仍然得到了 * 两个 * MappingJackson2HttpMessageConverter示例,其中一个使用了完全未配置且无法访问(据我所知)的ObjectMapper
  • Edit²:* 这不是重复bean的问题。ApplicationContext.getBeansOfType只返回ObjectMapperMappingJackson2HttpMessageConverter的 * 一个 * 示例,无论我是自己创建ObjectMapper还是让它由spring autoconfiguration创建。
    build.gradle:
buildscript {
    ext.springBootVersion = '2.0.0.RC1'

    repositories {
        mavenCentral()
        maven { url 'http://repo.spring.io/snapshot' }
        maven { url 'http://repo.spring.io/milestone' }
        maven { url 'http://repo.spring.io/libs-snapshot' }
    }
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion"
    }
}

group 'de.takeweiland.springtest'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

repositories {
    mavenCentral()
    maven { url 'http://repo.spring.io/snapshot' }
    maven { url 'http://repo.spring.io/milestone' }
    maven { url 'http://repo.spring.io/libs-snapshot' }
}

dependencies {
    compile "org.springframework.boot:spring-boot-starter-web"
}

配置类

package main;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Main {

    @Bean
    public ObjectMapper createObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        return mapper;
    }

    public static void main(String[] args) {
        SpringApplication.run(Main.class);
    }
}

控制器:

package main;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

    @GetMapping("**")
    @ResponseBody
    public String test() {
        return "Hello World";
    }
}
eni9jsuy

eni9jsuy1#

经过进一步的调查,我发现了这个问题,这只是一个问题,我的Jackson配置不工作,因为我认为它会。有两个MappingJackson2HttpMessageConverter不是问题。

gojuced7

gojuced72#

使用Sping Boot 和Web MVC的两个Jackson转换器的原因:
HttpMessageConvertersAutoConfiguration创建stringHttpMessageConvertermappingJackson2HttpMessageConverter(使用可配置的对象Map器)bean。HttpMessageConvertersAutoConfiguration还创建了一个HttpMessageConverters bean,并将前面提到的转换器作为名为“additionalConverters”的构造函数参数。使用的构造函数也有一个值为true的add default converters标志。它通过示例化WebMvcConfigurationSupport类并调用其getDefaultConverters方法来获取默认转换器。该方法创建第二个mappingJackson2HttpMessageConverter(使用默认的、不可配置的对象Map器)。HttpMessageConverters将通过构造函数传递的转换器与来自WebMvcConfigurationSupport示例的默认转换器联系起来。
包含重复json转换器的HttpMessageConverters在示例中由RestTemplateAutoConfiguration使用,因此由RestTemplateBuilder使用。

相关问题