Caused by: java.time.format.DateTimeParseException: 
Text '2000-02-09 16:05:20' could not be parsed at index 10

全部异常信息

SON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String "2000-02-09 16:05:20": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2000-02-09 16:05:20' could not be parsed at index 10; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDateTime` from String "2000-02-09 16:05:20": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2000-02-09 16:05:20' could not be parsed at index 10

原因 :转换出错

方式一 实现FeignFormatterRegistrar

@Component
public class LocalDateFeignFormatterRegistrar implements FeignFormatterRegistrar {
	@Override
	public void registerFormatters(FormatterRegistry registry) {
		registry.addConverter(LocalDate.class, String.class, new Converter<LocalDate, String>() {
			@Override
			public String convert(LocalDate source) {
				return LocalDateTimeUtil.format(source, DatePattern.NORM_DATETIME_PATTERN);
		});

方式二 添加对象映射

@Configuration
@AutoConfigureBefore(JacksonAutoConfiguration.class)
public class JacksonConfiguration {
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
     * 对象映射
    @Bean
    @Primary
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper()
                //指定要序列化的域
                .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY)
                // 不将日期写为时间戳
                .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                // 忽略未知属性
                .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
                // 对象属性为空时可以序列化
                .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
                .registerModule(new Java8TimeModule())
                .registerModule(new Jdk8Module())
                .registerModule(new JavaLongTypeModule())
                .registerModule(new SimpleModule());
        objectMapper.registerModule(new Jdk8Module());
        objectMapper.setDateFormat(new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT));
        objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
        objectMapper.registerModule(javaTimeModule).registerModule(new ParameterNamesModule());
        //设置null为""
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString("");
        });
        JsonKit.setObjectMapper(objectMapper);
        return objectMapper;
     * 序列化配置 ObjectMapper 对象
     * 会记录被序列化的类型信息, 反序列化时直接能反序列化回原始的对象类型
    @Bean
    public ObjectMapper typeObjectMapper(ObjectMapper objectMapper) {
        // 对象映射器
        ObjectMapper copy = objectMapper.copy();
        // 序列化是记录被序列化的类型信息
        //指定序列化输入的类型为非最终类型,除了少数“自然”类型(字符串、布尔值、整数、双精度),它们可以从 JSON 正确推断; 以及所有非最终类型的数组
        copy.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY)
                // null 值不序列化
                .setSerializationInclusion(JsonInclude.Include.NON_NULL);
        JsonKit.setTypeObjectMapper(copy);
        return copy;

方式三 在对应的数据上添加注解

* 创建时间 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; * 修改时间 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime modifyTime; 格式化 LocalDateTime 为 String 字符串格式化为日期,字符串必须符合 yyyy-MM-dd 格式 字符串格式化为日期,字符串必须符合 "yyyy-MM-dd HH:mm:ss" 格式(不支持 24:00:00 格式,需要转换为 00:00:00) 添加时间天数 减少时间天数 not a valid representation (error: Failed to parse Date value '2021-07-27 10:35:16': Cannot parse date "2021-07-27 10:35:16": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ', parsing fails (leniency? null)) 使用OpenFeign进行服务间调用返回的对象中时间类型为字
Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求,类似于Dubbo的RPC; 在Spring Cloud环境下,Fe...
Spring Cloud通过Feign客户端调用HTTP接口,如果返回值中包含LocalDateTime类型(包括其他JSR-310中java.time包的时间类),在客户端可能会出现反序列化失败的错误。错误信息如下: Caused by:com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDateTime` (no Creators 最近项目组用feign调用远程服务,消费端报了如下一个异常 从异常信息可以得出localdatime反序列化出了异常,而这个异常又是因为jackson无法处理导致。因此我们可以为jackson的ObjectMapper适配一下 解决方法 1、在pom.xml引入 <dependency> <groupId>com.fasterxml.jackson.datatype</groupId>
可以使用Java 8中的新日期时间API(java.time包)中的`LocalDate.parse()`方法将字符串转换LocalDate对象。下面是示例代码: ```java import java.time.LocalDate; public class StringToLocalDateConverter { public static void main(String[] args) { String dateString = "2021-03-15"; LocalDate date = LocalDate.parse(dateString); System.out.println("字符串转换LocalDate对象:" + date); 在上面的代码中,我们使用`LocalDate.parse(dateString)`方法将字符串转换LocalDate对象。被转换的字符串必须符合ISO-8601格式(例如:2021-03-15)。如果字符串格式不正确,则会抛出`DateTimeParseException`异常。 如果被转换的字符串包含时间区信息,则可以使用`LocalDateTime.parse()`或`ZonedDateTime.parse()`方法将其转换为相应的日期时间对象。