Spring Boot에서 json Date/LocalDateTime/LocalDate 형식 지정
기본적으로 Jackson은 객체를 타임스탬프로 직렬화합니다
Date
. LocalDateTime
, LocalDate
객체에 대해 jackson은 특별한 작업을 수행하지 않고 기본 Java 객체로 취급합니다.import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
public class MainTest {
public static void main(String... args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> map = new HashMap<>();
map.put("date", new Date());
map.put("localDateTime", LocalDateTime.now());
map.put("localDate", LocalDate.now());
String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);
System.out.println(json);
}
}
산출.
{
"date" : 1663680273923,
"localDateTime" : {
"dayOfMonth" : 20,
"dayOfWeek" : "TUESDAY",
"dayOfYear" : 263,
"month" : "SEPTEMBER",
"monthValue" : 9,
"year" : 2022,
"hour" : 21,
"minute" : 24,
"nano" : 992000000,
"second" : 33,
"chronology" : {
"id" : "ISO",
"calendarType" : "iso8601"
}
},
"localDate" : {
"year" : 2022,
"month" : "SEPTEMBER",
"era" : "CE",
"dayOfMonth" : 20,
"dayOfWeek" : "TUESDAY",
"dayOfYear" : 263,
"leapYear" : false,
"monthValue" : 9,
"chronology" : {
"id" : "ISO",
"calendarType" : "iso8601"
}
}
}
The above code runs normally in Java8. If you are in a higher version of java, such as java17, running the above code may throw an exception.
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.>LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through >reference chain: java.util.HashMap["localDateTime"]) at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300) at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35) at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeFields(MapSerializer.java:808) at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:764) at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:720) at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:35) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1518) at com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1219) at com.fasterxml.jackson.databind.ObjectWriter.writeValueAsString(ObjectWriter.java:1086) at io.springboot.test.MainTest.main(MainTest.java:22)
날짜
Date
개체의 형식은 spring boot에서 제공하는 구성 속성을 통해 쉽게 사용자 정의할 수 있습니다.spring:
jackson:
# Date format string or a fully-qualified date format class name. For instance, 'yyyy-MM-dd HH:mm:ss'
date-format: "yyyy-MM-dd HH:mm:ss.SSS"
# Locale used for formatting
time-zone: "GMT+8"
LocalDateTime 및 LocalDate
Spring Boot는
LocalDateTime
및 LocalDate
서식 지정을 위한 구성 속성을 제공하지 않지만 Jackson2ObjectMapperBuilderCustomizer
및 LocalDateTime
서식을 쉽게 사용자 지정할 수 있는 LocalDate
인터페이스를 제공합니다.import java.time.format.DateTimeFormatter;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
@Configuration
public class JacksonConfiguration {
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> {
// formatter
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// deserializers
builder.deserializers(new LocalDateDeserializer(dateFormatter));
builder.deserializers(new LocalDateTimeDeserializer(dateTimeFormatter));
// serializers
builder.serializers(new LocalDateSerializer(dateFormatter));
builder.serializers(new LocalDateTimeSerializer(dateTimeFormatter));
};
}
}
테스트
위의 코드와 구성이 적용되는지 확인하는 간단한 테스트입니다.
제어 장치
payload
, LocalDate
필드를 정의하는 LocalDateTime
객체로 클라이언트의 요청 본문을 읽고 구문 분석하는 간단한 컨트롤러입니다. 그리고 payload
개체로 클라이언트에 응답하여 사용자 지정 서식이 작동하는지 확인합니다.import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.Data;
@Data
class Payload {
private LocalDate date;
private LocalDateTime dateTime;
}
@RestController
@RequestMapping("/test")
public class TestController {
@PostMapping
public Object test (@RequestBody Payload payload) {
Map<String, Object> ret = new HashMap<>();
ret.put("payload", payload); // request body
ret.put("now", new Date());
return ret;
}
}
고객
Postman을 사용하여 http 요청을 시작합니다.
POST /test HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.29.2
Accept: */*
Postman-Token: 1b1cbcad-475e-49a9-ad5d-5a8163bd7b05
Host: localhost
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 70
{
"date": "2022-09-20",
"dateTime": "2022-09-20 21:02:00"
}
HTTP/1.1 200 OK
Content-Encoding: gzip
Connection: keep-alive
Server: PHP/7.3.1
X-Request-Id: 6038513c-fa65-49bf-8e6c-44f5db749832
Transfer-Encoding: chunked
Content-Type: application/json
Date: Tue, 20 Sep 2022 14:18:09 GMT
{"payload":{"date":"2022-09-20","dateTime":"2022-09-20 21:02:00"},"now":"2022-09-20 22:18:09.318"}
요청 및 응답 로그를 통해 모든 것이 정상임을 확인할 수 있습니다.
For more information about the available configurations of jackson in spring boot, you can refer to the official documentation。
참조https://www.springcloud.io/post/2022-09/springboot-date-format/
Reference
이 문제에 관하여(Spring Boot에서 json Date/LocalDateTime/LocalDate 형식 지정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kevinblandy/formatting-json-datelocaldatetimelocaldate-in-spring-boot-odf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)