我使用的是Java Spring引导RestController。我有一个示例GET API,在其中我将在响应主体中发送LocalDateTime.now((。我已经定制了Jackson ObjectMapper来注册Jackson-datatype-jsr310模块,但它无法串行化LocalDateTime实例。我在网上尝试了许多不同的解决方案,但似乎都不起作用。我在这里发布之前的解决方案如下所述。
GET API给出以下错误:
"不支持Java 8日期/时间类型
java.time.LocalDateTime
默认值:添加模块"com.fasterxml.jackson。数据类型:jackson-datatype-jsr310";启用处理(通过参考链:org.springframework.http.ResponseEntity["body"](;
代码:
ObjectMapper配置:
@Configuration
public class JacksonConfiguration {
@Bean
@Primary
public ObjectMapper objectMapper2(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.build();
objectMapper.findAndRegisterModules();
return objectMapper;
}
}
注意:我已经尝试过使用objectMapper.registerModule(新JSR310Module(((和objectMapper/registerModule(新JavaTimeModule(((。它们也不起作用。
休息控制器:
@RestController
public class TestController {
@GetMapping("/test")
public ResponseEntity<Object> test() {
return ResponseEntity.ok().body(LocalDateTime.now());
}
}
我使用的是spring-boot-starter-parent 2.5.4,所以它会自动为所有jackson.*依赖项使用2.12.4版本,包括jackson-datatype-jsr310。
欢迎使用Stack Overflow,就像datetime
中记录的一样,您当前使用的ObjectMapper objectMapper = builder.build();objectMapper.findAndRegisterModules();
行仅对2.9之前的jackson 2.x有效,而您的项目包括jackson 2.12.4库:就像我之前链接的官方文档一样,您必须使用以下代码:
// Jackson 2.10 and later
ObjectMapper mapper = JsonMapper.builder()
.findAndAddModules()
.build();
或者,如果您喜欢选择性地注册JavaTimeModule模块,也可以选择:
// Jackson 2.10 and later:
ObjectMapper mapper = JsonMapper.builder()
.addModule(new JavaTimeModule())
.build();
更新:我将问题中提出的原始代码修改为以下代码:
@Configuration
public class JacksonConfiguration {
@Bean
@Primary
public ObjectMapper objectMapper2(Jackson2ObjectMapperBuilder builder) {
ObjectMapper mapper = JsonMapper.builder()
.addModule(new JavaTimeModule())
.build();
return mapper;
}
}
javatime模块工作良好,并返回正确的LocalTime
json表示;如果没有配置类,则返回的值是正确的iso字符串。