java - 为什么 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。它没有帮助。
知道可能会发生什么,或者我应该在哪里寻找问题?
解决方案
- 创建一个
Jackson2ObjectMapperBuilderCustomizer
bean,例如。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); }; }
- 或者在 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
推荐阅读
- android - 如何在 WebView 中更新请求标头
- angular - 从 Angular HttpClient 使用 Spring Boot StreamingResponseBody
- sql - 我在寻找交叉连接吗?
- elixir - 获取迭代完成长生不老药的计数
- centos - Apache2 - htop 中奇怪的 sh 进程?
- javascript - 如何访问此“对象”的内容?
- mpandroidchart - mpandroidchart 散点图中点的颜色没有变化
- uml - 具有相互依赖的枚举的 UML 图
- python - 谁能告诉我出了什么问题,当我运行它时,浏览器显示“无法访问此站点”
- javascript - 如何仅禁用 html5 datepicker 上的选定日期?