Chef.Yeon
Code Cook
Chef.Yeon
전체 방문자
오늘
어제
  • 분류 전체보기 (230)
    • 게임 개발 (1)
      • Unity (1)
    • Android (27)
      • Kotlin (19)
      • 우아한테크코스 5기 (4)
    • Language (11)
      • 파이썬 (3)
      • Java (7)
    • DB (2)
      • SQL (16)
    • Spring (25)
    • 코딩테스트 (56)
    • Git (1)
    • TIL (85)
    • DevOps (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • enum
  • 에라토스테네스의 체
  • 코틀린 인 액션
  • 안드로이드
  • 프로그래머스
  • 우아한테크코스
  • Docker
  • grafana
  • Android
  • 백준
  • MariaDB
  • 문자열
  • 레포지토리
  • spring
  • 다이나믹 프로그래밍
  • SQL
  • 내림차순
  • 코틀린
  • 코딩테스트
  • 파이썬
  • kibana
  • Wil
  • rsocket
  • java
  • kotlin
  • elasticsearch
  • webflux
  • til
  • 프리코스
  • ec2

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Chef.Yeon

Code Cook

[TIL - 20240817] Spring Boot 3.x + Elasticsearch 8.x jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime`
TIL

[TIL - 20240817] Spring Boot 3.x + Elasticsearch 8.x jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime`

2024. 8. 17. 01:44

 

💻문제점 - LocalDateTime 직렬화/역직렬화

Elasticsearch 검색을 수행하던 도중 오류가 발생했다.

http://localhost:8080/api/v1/posts/suggest?keyword=통밀빵

 

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

 

LocalDateTime의 직렬화/역직렬화 문제가 발생했다.


🔍해결

ElasticsearchConfig에 ElasticsearchClient 빈을 생성하는 코드를 추가하고, JacksonJsonpMapper에 JavaTimeModule을 등록하여 LocalDateTime을 처리할 수 있도록 설정했다.

 

ElasticsearchConfig

@Configuration
@EnableElasticsearchRepositories
public class ElasticsearchConfig extends ElasticsearchConfiguration {
    @Value("${spring.elasticsearch.username}")
    private String username;

    @Value("${spring.elasticsearch.password}")
    private String password;

    @Value("${spring.elasticsearch.host}")
    private String host;

    @Override
    public ClientConfiguration clientConfiguration() {
        return ClientConfiguration.builder()
                .connectedTo(host)
                .build();
    }

    @Bean
    public ElasticsearchClient elasticsearchClient(RestClient restClient) {
        ObjectMapper objectMapper =
                new ObjectMapper()
                        .registerModule(new JavaTimeModule())
                        .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        ElasticsearchTransport transport =
                new RestClientTransport(restClient, new JacksonJsonpMapper(objectMapper));
        return new ElasticsearchClient(transport);
    }
}

 

1. ObjectMapper 생성

Jackson 라이브러리의 ObjectMapper는 JSON 데이터를 Java 객체로 변환하거나, Java 객체를 JSON으로 변환하는 데 사용된다. 

  • registerModule(new JavaTimeModule())
    • JavaTimeModule을 등록하여 LocalDateTime과 같은 Java8 날짜/시간 타입을 처리할 수 있도록 한다.
  • disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
    • 날짜/시간이 타임 스탬프가 아닌 ISO-8601 문자열 형식('yyyy-MM-dd'T'HH:mm:ss.SSSZ ')으로 직렬화 되도록 한다.

 

2. ElasticsearchTransport 생성

RestClientTransport는 Elasticsearch 서버와의 통신을 담당한다. 

RestClientTransport를 생성할 때, JacksonJsonpMapper에 objectMapper를 전달하여 LocalDateTime을 지원하도록 설정한다.

 

3. ElasticsearchClient

설정한 ElasticsearchTransport를 사용하여 ElasticsearchClient를 생성하고 빈으로 등록한다.

 

728x90

'TIL' 카테고리의 다른 글

[TIL - 20240819] Elasticsearch8.x + Kibana, Docker-compose로 구성, Credential 설정  (0) 2024.08.19
[TIL-20240813-17] Elasticsearch 자동 완성 (2)  (0) 2024.08.13
[TIL - 20240810~12] ElasticSearch 자동 완성 (1)  (0) 2024.08.12
[TIL-20240805] ElasticSearch + Spring Boot 연동 오류 해결  (0) 2024.08.05
[TIL - 20240612] Swagger HTTPS 설정  (0) 2024.06.12
    'TIL' 카테고리의 다른 글
    • [TIL - 20240819] Elasticsearch8.x + Kibana, Docker-compose로 구성, Credential 설정
    • [TIL-20240813-17] Elasticsearch 자동 완성 (2)
    • [TIL - 20240810~12] ElasticSearch 자동 완성 (1)
    • [TIL-20240805] ElasticSearch + Spring Boot 연동 오류 해결
    Chef.Yeon
    Chef.Yeon
    보기 좋고 깔끔한 코드를 요리하기 위해 노력하고 있습니다.

    티스토리툴바