无法在Spring Boot应用程序中注入多个ObjectMapper bean

时间:2015-10-19 21:10:04

标签: jackson spring-boot

我使用@Bean注释定义bean并尝试使用name连接它们,但是接收异常。

完成示例

package com.example;

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

@SpringBootApplication
@ComponentScan({"com.example"})
public class SampleSpringBootApplication {

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


    @Bean
    public ObjectMapper scmsObjectMapper() {
        com.fasterxml.jackson.databind.ObjectMapper responseMapper = new com.fasterxml.jackson.databind.ObjectMapper();
        return responseMapper;
    }

    @Bean
    public ObjectMapper scmsWriteObjectMapper() {
        com.fasterxml.jackson.databind.ObjectMapper responseMapper = new com.fasterxml.jackson.databind.ObjectMapper();
        return responseMapper;
    }
}

控制器

package com.example;

import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SampleController {

    @RequestMapping(method={RequestMethod.GET}, value="sample/hello", produces=MediaType.APPLICATION_JSON_VALUE)
    @ResponseStatus(HttpStatus.OK)
    public @ResponseBody ResponseEntity<String> getCart() {
        return new ResponseEntity<String>("Hello", HttpStatus.OK);
    }


}

的build.gradle

buildscript {
    ext {
        springBootVersion = '1.2.7.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
        classpath('io.spring.gradle:dependency-management-plugin:0.5.2.RELEASE')
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot' 
apply plugin: 'io.spring.dependency-management' 

jar {
    baseName = 'Sample-SpringBoot'
    version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter')
    testCompile('org.springframework.boot:spring-boot-starter-test') 
    compile("org.springframework.boot:spring-boot-starter-web:1.2.3.RELEASE")
    compile('com.fasterxml.jackson.core:jackson-databind:2.5.1')
}


eclipse {
    classpath {
         containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
         containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.7'
}

异常

 Caused by:
 org.springframework.beans.factory.NoUniqueBeanDefinitionException: No
 qualifying bean of type [com.fasterxml.jackson.databind.ObjectMapper]
 is defined: expected single matching bean but found 2:
 scmsObjectMapper,scmsWriteObjectMapper

1 个答案:

答案 0 :(得分:15)

默认情况下,Spring Boot定义了MappingJackson2HttpMessageConverter类型的bean,并尝试向其中注入ObjectMapper。这通常允许您简单地声明ObjectMapper @Bean,以您需要的任何方式配置它,并让Spring Boot为您完成其余的工作。

在这里,这已经适得其反,因为你声明了其中两个。

一个解决方案as described in the documentation,用于注释要注入@Bean的{​​{1}}定义。

  

如果要完全替换默认@Primary,请定义a   该类型的ObjectMapper并将其标记为@Bean

例如,

@Primary

Spring Boot将使用那个。

或者,您可以声明自己的@Bean @Primary public ObjectMapper scmsObjectMapper() { com.fasterxml.jackson.databind.ObjectMapper responseMapper = new com.fasterxml.jackson.databind.ObjectMapper(); return responseMapper; } bean定义并在内部配置所有内容。来自相同的文档

  

最后,如果您提供任何类型的MappingJackson2HttpMessageConverter   @Bean然后他们将替换默认值   MVC配置中的值。

例如(取自here

MappingJackson2HttpMessageConverter