【发布时间】:2020-12-22 08:58:20
【问题描述】:
Jackson 不会自动将复杂的字段名称从 json-object 转换为 dto-object。
我收到了一个请求
@PostMapping(path = "model/byFile")
public ResponseEntity<ModelDto>
createModel(@RequestBody List<DataFileDto> modelList) {
}
- dto
public class DataFileDto {
@NotNull
String kyId;
@NotNull
String nameAs;
//default constructor
//getters and setter
//Builder
}
json到了,转换的时候,Jackson取出值,只用简单的词放,复合词写null。
为避免这种情况,我必须使用 @JsonProperty("ky_id") 属性,我觉得这很不方便。该项目本身是旧的。我不能在那里添加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
或
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.0</version>
</dependency>
因为那样项目就会中断。
我还注意到那里设置了一个自定义 ObjectMapper 配置。
@Bean
public ObjectMapper mapper() {
var module = new SimpleModule();
module.addSerializer(BigDecimal.class, new BigDecimalSerializer());
var objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.registerModule(module);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS, true);
return objectMapper;
}
更新
我加了
...
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
...
谢谢
尽管存在 setter 和 getter,但 Jackson 不能正常使用复合词这一事实可能会受到什么影响?
如何解决这个问题?
【问题讨论】:
-
您用 JsonProperty 注释说自己如何修复它。我认为您还可以使用 .setPropertyNamingStrategy() 方法为您的 objectMapper 配置命名策略
-
(...JsonProperty annotation.) - 我有包含大量字段的对象,因此不能将其放在字段上方
-
然后使用映射器中的全局配置。
标签: spring-boot rest jackson