JSON 解析错误:java.time.format.DateTimeParseException [Spring Boot - Feign 客户端]

问题描述 投票:0回答:1

当我使用 feignclient 向包含 java.util.Date 的服务发出请求时,出现此错误“

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: java.time.format.DateTimeParseException: Text '1692738000000' could not be parsed at index 0

我的dto;

public class InputDto {
    private Date startDate;
    private Date endDate;
}

Feign客户端服务;

@PostMapping(value = {"/searchFile"}, produces = {MediaType.APPLICATION_JSON_VALUE})
ResponseEntity<ServiceResponse<List<FileDto>>> searchFile(@RequestBody InputDto searchDto);

如果我将变量定义为 java.time.LocalDate 我不会收到错误。为什么会出现这个问题?

java spring-boot spring-cloud-feign feign
1个回答
0
投票

在我看来,一个好的解决方案是自定义日期序列化,这样:

首先,为

Date
类创建一个自定义序列化器,将日期格式化为特定格式的字符串。在此示例中,我将使用 ISO-8601 日期格式:

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

public class CustomDateSerializer extends JsonSerializer<Date> {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");

    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(dateFormat.format(value));
    }
}

接下来,为

Date
类创建一个自定义反序列化器,以相同的格式解析日期字符串:

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

public class CustomDateDeserializer extends JsonDeserializer<Date> {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");

    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String dateString = p.getText();
        try {
            return dateFormat.parse(dateString);
        } catch (ParseException e) {
            throw new IOException("Error parsing date: " + dateString, e);
        }
    }
}

然后,使用自定义序列化器和反序列化器注释

Date
类中的
InputDto
字段:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

public class InputDto {
    @JsonSerialize(using = CustomDateSerializer.class)
    @JsonDeserialize(using = CustomDateDeserializer.class)
    private Date startDate;

    @JsonSerialize(using = CustomDateSerializer.class)
    @JsonDeserialize(using = CustomDateDeserializer.class)
    private Date endDate;

    // getters and setters
}
© www.soinside.com 2019 - 2024. All rights reserved.