Jackson不支持Java 8日期/时间类型LocalDate的解决办法

后端 潘老师 2年前 (2023-10-28) 208 ℃ (0) 扫码查看

Jackson – Java 8日期/时间类型java.time.LocalDate默认不受支持。尝试使用Jackson将包含Java 8时间API(如LocalDate)的对象转换为JSON格式的字符串时遇到错误,即:“ Java 8 date/time type `java.time.LocalDate` not supported by default”。

比如如下示例:

import java.math.BigDecimal;
import java.time.LocalDate;

public class Book {

  private Long id;
  private String title;
  private BigDecimal price;
  // Java 8 only
  private LocalDate publishDate;

  //...
}

App.java:

 ObjectMapper om = new ObjectMapper();

  Book book =
          new Book(1L, "Book A",
                  BigDecimal.valueOf(9.99),
                  LocalDate.of(2023, 10, 1));

  // 将对象转为 json
  String result = om.writeValueAsString(book);

运行抛出异常如下:

Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
  Java 8 date/time type `java.time.LocalDate` not supported by default:
  add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling
  (through reference chain: com.mkyong.json.model.Book["publishDate"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
......

解决办法,使用jackson-datatype-jsr310

Jackson默认不支持Java 8日期时间APIs;我们需要手动添加依赖项jackson-datatype-jsr310并注册JavaTimeModule()以使Jackson支持Java 8日期时间APIs。

pom.xml:

<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${jackson.version}</version>
  </dependency>

  <!-- 支持"Java 8 Dates" -->
  <dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jsr310</artifactId>
      <version>${jackson.version}</version>
  </dependency>

代码实现:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

  ObjectMapper om = new ObjectMapper();
  objectMapper.registerModule(new JavaTimeModule());

  // 将对象转为 json
  String result = om.writeValueAsString(book);

或者使用这样的代码实现:

  ObjectMapper om = new ObjectMapper();
  om.findAndRegisterModules();

以上就是Jackson不支持Java 8日期/时间类型LocalDate的解决办法。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10445.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】