【问题标题】:Spring Boot configures two MappingJackson2HttpMessageConverter instancesSpring Boot 配置了两个 MappingJackson2HttpMessageConverter 实例
【发布时间】:2018-07-10 14:31:51
【问题描述】:

我在使用新创建的 Spring Boot 应用程序时遇到问题。出于某种原因,something 正在将 two MappingJackson2HttpMessageConverter 实例添加到 Spring Web MVC 的返回值处理中(我使用调试器发现了这一点)。 其中一个使用我通过配置类中的@Bean 方法创建的ObjectMapper 实例,另一个使用一些随机的其他实例。因此,第二个ObjectMapper 完全未配置,我的ObjectMapper 配置不适用于@ResponseBody 使用的JSON 序列化。

如何停止这种重复?您可以在下面找到我的所有代码。

编辑:这个问题与我的自定义ObjectMapper bean有关。即使我删除它(除了@SpringBootApplication 之外的完全空配置),我仍然得到两个 MappingJackson2HttpMessageConverter 实例,其中一个使用完全未配置且无法访问(据我所知)@987654330 @。

Edit²: 这不是重复 bean 的问题。 ApplicationContext.getBeansOfType 只为ObjectMapperMappingJackson2HttpMessageConverter 返回一个 实例,无论我是自己创建ObjectMapper 还是让它由spring 自动配置创建。

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";
    }
}

【问题讨论】:

  • 你知道,如果你使用注释RestController,它结合了Controller和ResponseBody,所以你可以只使用RestController并省略ResponseBody。
  • 谢谢,我知道了。但是,我将这个示例保持在最低限度,以便更容易找出问题的根源。
  • 好吧。 1 个注释而不是 2 个将是最少的......只是说'
  • 为什么要实例化 ObjectMapper 类?
  • 因为我想通过例如添加 mixin 注释等来配置ObjectMapper。即使我采用将com.fasterxml.jackson.databind.Module 注册为Spring @Component 的替代方法,它将自动将其注册到标准 ObjectMapper,只有 一个 创建的 ObjectMapper 实例将具有这些模块。

标签: java spring spring-mvc spring-boot


【解决方案1】:

经过进一步调查,我发现了这个问题,这只是我的 Jackson 配置没有像我想象的那样工作的问题。 拥有两个MappingJackson2HttpMessageConverter 不是问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2017-04-27
    • 1970-01-01
    • 2020-02-09
    • 2014-09-01
    • 1970-01-01
    • 2016-07-21
    相关资源
    最近更新 更多