当我使用 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 我不会收到错误。为什么会出现这个问题?
在我看来,一个好的解决方案是自定义日期序列化,这样:
首先,为
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
}