【发布时间】: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 只为ObjectMapper 和MappingJackson2HttpMessageConverter 返回一个 实例,无论我是自己创建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