>  기사  >  LocalDateTime 역직렬화 문제: Jackson InvalidFormatException

LocalDateTime 역직렬화 문제: Jackson InvalidFormatException

王林
王林앞으로
2024-02-22 13:58:06359검색

PHP 편집자 Zimo는 Java가 LocalDateTime을 역직렬화할 때 문제에 대한 솔루션을 제공합니다. 역직렬화를 위해 Jackson 라이브러리를 사용할 때 특히 LocalDateTime 유형을 처리할 때 InvalidFormatException 예외가 발생하는 경우가 있습니다. 이 문서에서는 이 일반적인 역직렬화 예외를 성공적으로 해결하는 데 도움이 되도록 이 문제의 원인과 해결 방법을 자세히 소개합니다.

질문 내용

스프링 부트 애플리케이션에서 localdatetime을 역직렬화하는 데 문제가 있습니다. 아래는 관련 코드입니다.

프런트엔드:

으아악

백엔드: lancamento 클래스:

으아악

resumolancamento 카테고리:

으아악

질문:

com.fasterxml.jackson.databind.exc.invalidformatException: 문자열 "10/01/2024"에서 역직렬화할 수 없습니다. java.time.localdatetime 유형의 값: java.time.localdatetime을 역직렬화할 수 없습니다: (java.time.format .datetimeparseexception) 구문 분석 텍스트 "10/01/2024": temporaryaccessor: {}에서 localdatetime을 가져올 수 없습니다. iso는 java.time.format.parsed 유형의 2024-01-10으로 구문 분석되었습니다. [출처: (org.springframework.util.streamutils$nonclosinginputstream); 줄: 1, 열: 63] (참조 체인을 통해: com.algaworks.algamoney_api.domain.model.lancamento["datavencimento"])

lancamentos의 console.log()에서 "datavencimento" 및 "datapagamento" 속성의 형식은 "dd/mm/yyyy"입니다.

역직렬화 중에 날짜 형식 문제가 있는 것 같습니다. 프런트엔드 및 백엔드 코드를 업데이트했는데도 문제가 지속됩니다. 문제는 고객에게 있는 것 같은데 잘 모르겠습니다.

  1. 스프링 부트 애플리케이션에서 문자열에서 localdatetime을 역직렬화할 때 잘못된 형식 예외를 수정하는 방법은 무엇입니까?
  2. 올바른 localdatetime 직렬화 및 역직렬화에는 특정 구성이나 조정이 필요합니까?

어떤 안내나 제안이라도 주시면 감사하겠습니다. 감사해요!

dataconverter() 메소드로 모든 작업을 수행했지만 여전히 성공하지 못했습니다.

update(lancamento: lancamento): promise<lancamento> {
      const headers = new httpheaders()
        .set('authorization', this.chave)
        .set('content-type', 'application/json');

        this.conversordedata([lancamento]);

        return firstvaluefrom(this.http.put<any>(`${this.url}/${lancamento.codigo}`,
      lancamento, { headers }));
    }

    findbycode(codigo: number): promise<lancamento> {
      const headers = new httpheaders()
        .set('authorization', this.chave);

      return this.http.get(`${this.url}/${codigo}`,
        { headers })
        .topromise()
        .then((response: any) => {
          const lancamento = response as lancamento;

          this.conversordedata([lancamento]);

          return lancamento;
        })
        .catch((error: any) => {
          console.error('erro ao buscar lançamento por código: ', error);
          throw error;
        });
    }

//se os atributos forem do tipo date
conversordedata(lancamentos: lancamento[]){
  for(const lancamento of lancamentos){
    if(lancamento.datavencimento && isvalid(lancamento.datavencimento)){
      lancamento.datavencimento = new date(format(lancamento.datavencimento, 'dd/mm/yyyy'));
    }
    if(lancamento.datapagamento && isvalid(lancamento.datapagamento)){
      lancamento.datapagamento = new date(format(lancamento.datapagamento, 'dd/mm/yyyy'));
    }

  }
}

해결 방법

이 문제를 해결하려면 다음 중 하나를 수행할 수 있습니다.

옵션 1: json 날짜 형식 조정 "yyyy-mm-ddthh:mm:ss" 패턴이나 localdatetime과 직접 호환되는 형식과 일치하도록 json 페이로드의 날짜 형식을 변경합니다. 예:

으아악

옵션 2: @jsondeserialize를 사용하여 사용자 지정 역직렬화 형식 지정 lancamento 클래스의 localdatetime 필드에 @jsondeserialize 주석을 달아 사용자 정의 역직렬화 형식을 지정할 수 있습니다. 예:

으아악

json 페이로드에서 역직렬화 형식이나 날짜 형식을 조정하여 올바르게 정렬되도록 해야 합니다. 요구 사항과 코딩 방식에 가장 적합한 방법을 선택하세요.

옵션 3: 이 문제는 Java의 localdatetime에 날짜 및 시간 구성 요소가 포함된 "dd/mm/yyyy" 패턴에 대한 직접적인 포맷터가 없기 때문에 발생합니다. 날짜 구성 요소에만 관심이 있는 경우 이러한 필드의 유형을 localdate로 변경해야 할 수도 있습니다.

으아악

위 내용은 LocalDateTime 역직렬화 문제: Jackson InvalidFormatException의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제