当前位置: 首页 > 知识库问答 >
问题:

Spring Boot不使用配置的Jackson ObjectMapper和@enableWebMVC

祁均
2023-03-14

我想在我的项目中使用JacksonObjectMapper的配置版本(忽略空值和snake_case,也使用一些自定义模块)。

在我的大型项目中,我无法让Spring MVC真正使用这个映射器。

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

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
  mavenCentral()
}

dependencies {
  compile('org.springframework.boot:spring-boot-starter')
  compile("org.springframework.boot:spring-boot-starter-jetty:${springBootVersion}")
  compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}")

  compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.8.8'
  compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.8'

  testCompile('org.springframework.boot:spring-boot-starter-test')
}
spring:
  application:
  name: Jackson test
jackson:
  property-naming-strategy: SNAKE_CASE
  default-property-inclusion: non_empty
debug: true
public class MyLocationEntity {
    public String nameAndSnake;
}
@Configuration
@EnableWebMvc
public class AppConfig {
}
@RestController
@RequestMapping("/test")
public class TestController {

  @Autowired
  private ObjectMapper objectMapper;

  @RequestMapping(value = "/test", produces = "application/json")
  public MyLocationEntity test() throws JsonProcessingException {
    MyLocationEntity location = new MyLocationEntity();
    location.nameAndSnake = "hello world";
    String expexted = objectMapper.writeValueAsString(location);
    return location;
  }
}

如果我现在查看调试器中expected的值,它是{“name_and_snake”:“hello world”}。但是如果我让控制器运行,实际的响应是{“nameandsnake”:“hello world”}

当我删除@enableWebMVC时,它就可以工作了。如何将配置的映射器与MVC一起使用,而不删除Web MVC的其余自动配置?

共有1个答案

关苗宣
2023-03-14

这不仅从Javadocs中可以看出,而且@enableWebMVC禁用了由WebMVcautoConfiguration提供的Spring Boot默认web MVC自动配置,包括使用由application.yml属性配置的JacksonObjectMapperbean。根据Spring Boot参考文档:

完全控制MVC配置的最简单方法是使用@enableWebMVC注释提供您自己的@configuration。这样做将所有MVC配置都掌握在您的手中。

因此,必须手动配置MVC配置,以便将Spring Bootapplication.yml属性与@enableWebMVC注释协同使用。对此有几种不同的可能方法。

第一种方法是从webmvcautoconfiguration.enablewebmvcconfiguration.configureMessageConverters()复制Spring Boot配置代码。这将用默认Spring Boot配置中使用的消息转换器替换消息转换器-- 包括MappingJackson2HttpMessageConverter,其中包含未配置的ObjectMapper- :

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private ObjectProvider<HttpMessageConverters> messageConvertersProvider;

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        this.messageConvertersProvider
                .ifAvailable((customConverters) -> converters.addAll(customConverters.getConverters()));
    }
}

或者,不使用消息转换器的默认Spring Boot列表,也可以只交换Spring Boot提供的ObjectMapperMappingJackson2HttpMessageConverterbean(它们应用了application.yml属性):

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.stream()
                .filter(c -> c instanceof MappingJackson2HttpMessageConverter)
                .map(c -> (MappingJackson2HttpMessageConverter) c)
                .forEach(c -> c.setObjectMapper(objectMapper));

    }
}

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (int i = 0; i < converters.size(); i++) {
            if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
                converters.set(i, mappingJackson2HttpMessageConverter);
            }
        }
    }
}
 类似资料:
  • 我有教育问题: 存在具有windows server 2003(AD)的虚拟机,其中包含用户及其密码。已建立与机器的连接(ip:192.168.56.101:389)。 Web应用程序的目的是使用户能够在AD中更改他的密码。 问题:无法配置到windws server 2003的连接。 我从这个教程开始https://spring.io/guides/gs/authenticating-ldap/

  • 我正在用SpringBoot配置Consor,并在这里找到了一个文档。即使浏览了其他资源,也没有找到其他配置或场景。 因此,我很好奇当springboot应用程序与consul集成时是否只有这些配置可用。我想深入了解,有人能让我知道任何其他可用的属性吗?

  • 我正在尝试将Apache shiro 1.7.0添加为安全管理器,您会发现我的配置类: shiro的pom.xml条目: 该项目编译成功,但我得到了上面的错误,而试图访问web应用程序,我感谢任何麻或建议。 启动Tomcat上下文时出错。异常:org.springframework.beans.factory.beancreationexception。消息:创建类路径资源[org/apache/

  • 在我向Maven添加了HATEOAS的依赖项之后,Spring Boot不会启动: 添加得依赖项: unsatisfiedDependencyException:创建名为“Security Config”的bean时出错:通过方法“Set ContentNegotationStrategy”参数0表示的不满足依赖项;嵌套异常为org.springframework.beans.factory.un

  • <dependencyManagement> <dependencies> <dependency> <!--Import dependency management from SpringBoot--> <groupId>org.springframework.boot</groupId>

  • 我有在openshift中运行的springboot和非springboot(Eclipse Microprofile)Rest API。两者都有服务endpoint端口9443 SpringBoot度量路径-/actuator/Prometheus Eclipse micro profile度量路径/度量 Eclipse微配置文件抓取配置 Spring靴刮擦配置 由于MP指标在springboo