我遇到了新创建的Sping Boot 应用程序的问题。出于某种原因,something 正在向Spring Web MVC的返回值处理添加 * 两个 * MappingJackson2HttpMessageConverter
示例(我使用调试器发现了这一点)。其中一个使用我通过配置类中的@Bean
方法创建的ObjectMapper
示例,另一个使用其他随机示例。因此,第二个ObjectMapper
是完全未配置的,我的ObjectMapper
配置没有应用到@ResponseBody
使用的JSON序列化。
我怎样才能停止这种重复?你可以在下面找到我的所有代码。
- 编辑:* 这个问题与我的自定义
ObjectMapper
bean无关。即使我删除了它(除了@SpringBootApplication
之外完全是空的配置),我仍然得到了 * 两个 *MappingJackson2HttpMessageConverter
示例,其中一个使用了完全未配置且无法访问(据我所知)的ObjectMapper
。 - Edit²:* 这不是重复bean的问题。
ApplicationContext.getBeansOfType
只返回ObjectMapper
和MappingJackson2HttpMessageConverter
的 * 一个 * 示例,无论我是自己创建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";
}
}
2条答案
按热度按时间eni9jsuy1#
经过进一步的调查,我发现了这个问题,这只是一个问题,我的Jackson配置不工作,因为我认为它会。有两个
MappingJackson2HttpMessageConverter
不是问题。gojuced72#
使用Sping Boot 和Web MVC的两个Jackson转换器的原因:
HttpMessageConvertersAutoConfiguration
创建stringHttpMessageConverter
和mappingJackson2HttpMessageConverter
(使用可配置的对象Map器)bean。HttpMessageConvertersAutoConfiguration
还创建了一个HttpMessageConverters
bean,并将前面提到的转换器作为名为“additionalConverters”的构造函数参数。使用的构造函数也有一个值为true的add default converters标志。它通过示例化WebMvcConfigurationSupport
类并调用其getDefaultConverters
方法来获取默认转换器。该方法创建第二个mappingJackson2HttpMessageConverter
(使用默认的、不可配置的对象Map器)。HttpMessageConverters
将通过构造函数传递的转换器与来自WebMvcConfigurationSupport
示例的默认转换器联系起来。包含重复json转换器的
HttpMessageConverters
在示例中由RestTemplateAutoConfiguration
使用,因此由RestTemplateBuilder
使用。