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 type
java.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
References
The post Jackson – Java 8 date/time type `java.time.LocalDate` not supported by default appeared first on Mkyong.com.