Quantcast
Channel: Mkyong.com
Viewing all articles
Browse latest Browse all 28

Jackson – Java 8 date/time type `java.time.LocalDate` not supported by default

$
0
0

Try Jackson to convert an object containing the Java 8 time APIs like LocalDate to a JSON formatted string and hits the errors Java 8 date/time typejava.time.LocalDatenot supported by default

Book.java

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));

  // convert object to json
  String result = om.writeValueAsString(book);
Terminal

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)
  at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1308)
  at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35)
  at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732)
  at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:772)
  at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
  at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:479)
  at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:318)
  at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1572)
  at com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1273)
  at com.fasterxml.jackson.databind.ObjectWriter.writeValueAsString(ObjectWriter.java:1140)
  at com.mkyong.json.jackson.Java8TimeApiSupportApp.main(Java8TimeApiSupportApp.java:22)

1. jackson-datatype-jsr310

Jackson, by default, does not support the Java 8 date time APIs; We need to manually add the dependency jackson-datatype-jsr310 and register the JavaTimeModule() to make Jackson support Java 8 date time APIs.

pom.xml

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

  <!-- support for "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());

  // convert object to json
  String result = om.writeValueAsString(book);

or like this.


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

Download Source Code

$ git clone https://github.com/mkyong/java-json

$ cd src/jackson/

find Java8TimeApiSupportApp.java

References

The post Jackson – Java 8 date/time type `java.time.LocalDate` not supported by default appeared first on Mkyong.com.


Viewing all articles
Browse latest Browse all 28

Trending Articles