首页 > 解决方案 > 为什么 Spring Boot 不使用自定义 ObjectMapper bean?

问题描述

我有自定义 ObjectMapper bean 注释为@Primary。

@Configuration
public class BeanConfig {

    @Bean
    @Primary
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new Jdk8Module());
        objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_ABSENT);
        return objectMapper;
    }

}

但是,当我尝试使用不同大小写的枚举解析表单时,它给了我错误。

@RestController
@RequestMapping("/game")
public class GameController {

    private final GameService gameService;

    public GameController(GameService gameService) {
        this.gameService = gameService;
    }

    @PostMapping("/create")
    public ResponseEntity<?> createGame(
            @AuthenticationPrincipal String id,
            GameParametersForm gameParametersForm
    ) {
        Result<String> result = gameService.createWebGameSession(id, gameParametersForm);
        return result.toResponseEntity();
    }

}
public class GameParametersForm {

    private Mode mode;

    public GameParametersForm(
            Mode mode
    ) {
        this.mode = mode;
    }

    public Mode getMode() {
        return mode;
    }

}

这是 build.gradle

plugins {
    id 'org.springframework.boot' version '2.4.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
    maven { url 'https://jitpack.io' }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.fasterxml.jackson.core:jackson-annotations:2.12.2'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.2'
    implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.12.2'
    implementation 'javax.validation:validation-api:2.0.1.Final'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-websocket'
    implementation 'org.springframework.boot:spring-boot-starter-mail'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.security:spring-security-test'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

我试图声明 Jackson2ObjectMapperBuilder bean。它没有帮助。
知道可能会发生什么,或者我应该在哪里寻找问题?

标签: javaspringspring-boot

解决方案


  1. 创建一个Jackson2ObjectMapperBuilderCustomizerbean,例如。hantsy/spring-r2dbc-sample DemoApplication.java#L152
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> {
            builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
            builder.featuresToDisable(
                    SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
                    SerializationFeature.FAIL_ON_EMPTY_BEANS,
                    DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES,
                    DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
            builder.featuresToEnable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
        };
    }
    
  2. 或者在 spring boot 应用程序属性中自定义。例如。hantsy/spring-webmvc-jwt-sample application.yml#L4
     spring:
       jackson:
         mapper:
           DEFAULT_VIEW_INCLUSION: true
         serialization:
           indent_output: true
           WRITE_DATES_AS_TIMESTAMPS: false
         deserialization:
           FAIL_ON_IGNORED_PROPERTIES: false
           FAIL_ON_UNKNOWN_PROPERTIES: false
           ACCEPT_SINGLE_VALUE_AS_ARRAY: true
         default-property-inclusion: non_empty
    

推荐阅读