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

Jackson ObjectMapper。findAndRegisterModules()无法序列化LocalDateTime

寿和通
2023-03-14

我正在使用JavaSpring-boot RestController。我有一个示例GET API,在其中我将LocalDateTime.now()发送到响应正文中。我已经自定义了Jackson ObjectMapper来注册jackson-datatype-jsr310模块,但是它无法序列化LocalDateTime实例。我尝试了许多不同的在线解决方案,但是似乎都不起作用。下面提到了我在这里发布之前的解决方案。

GET API出现以下错误:

默认情况下不支持“Java 8日期/时间类型:添加模块”com。fasterxml。杰克逊。数据类型: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())。它们也不起作用。

Rest控制器:

@RestController
public class TestController {
    @GetMapping("/test")
    public ResponseEntity<Object> test() {
        return ResponseEntity.ok().body(LocalDateTime.now());
    }
}

我使用的是spring boot starter 2.5.4版本,因此它会自动为所有jackson使用2.12.4版本。*依赖项包括jackson-datatype-jsr310。

共有1个答案

翟元凯
2023-03-14

欢迎来到Stack Overflow,就像在datetime中记录的行ObjectMapper ObjectMapper Mapper=builder.build(); ObjectMapper.findAndregisterModules();您当前使用的仅适用于jackson 2. x 2.9之前的版本,而您的项目包含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模块工作正常并返回正确的LocalTimejson表示;没有配置类,返回的值是正确的iso字符串。

 类似资料:
  • 问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是

  • 问题内容: 作为一个小项目,我一直在尝试做一个小事,它可以读取序列化的lambda(从本地或从FTP)并调用它们的运行函数作为测试的一部分,以测试Windows中的文件关联(即打开某些文件类型)使用特定程序打开它们),但不管如何,无论如何,它似乎从未正确地反序列化。 lambda被这样声明 并使用由ObjectOutputStream包装的[n可选] BufferedOutputStream包装的

  • 问题内容: 在hibernate状态下执行条件查询时,出现以下异常: 可能是什么问题呢? PS:虽然可能不相关,但我的hibernate版本是hibernate-4.0.1 final。 问题答案: 问题在于被引用的实体对实体有另一个引用,并且该关系未由任何-like注释进行注释。

  • 问题内容: 我正在使用Hibernate的两个表,但我不明白为什么对于特定查询我有此问题。我希望有人意识到这个问题。 我有一个桌子用户 和一个桌子区域 日志说: 问题答案: 我建议仅在字段或getter上设置注释。我更喜欢田野,但那只是我的口味。 请参阅Hibernate中有关字段和属性访问的奇怪案例: 因此,要么将注释仅放置在字段上,要么仅放置在getters(properties)上。混合它们

  • 在我的工作场所,我使用Tomcat6+Java6(我认为)测试了一个GWT webapp,运行良好,但今天它升级到Java7(Java版本输出),当我试图打开webapp时,我在catalina.out中收到以下错误(index.html中的布局运行良好): Grave:在分发传入的RPC调用com.google.gwt.user.client.RPC.SerializationException

  • 作为一个小项目,我一直在尝试制作一个小东西来读取序列化的lambda(本地或从FTP)并调用它们的run函数,作为测试的一部分,以在Windows中试验文件关联(即打开某些文件类型会用某个程序打开它们)等等,但无论我尝试什么,它似乎都无法正确地反序列化。 lambda是这样宣布的 并使用由ObjectOutputStream包装的[n可选]BufferedOutputStream包装的FileOu