LocalDateTime无法解析新的解决方案

接原文章LocalDateTime接收前端日期参数差8个小时、无法解析、返回前端带T等疑难杂症解决方案

把反序列化改写了一下,前几个和原文章差不多:

  1. LocalDateFormatConfig
package com.zoomlgd.config;

import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

/**
 * @author DepengZhang
 * @date 2021年12月03日 18:41
 */
@Configuration
public class LocalDateFormatConfig {

	/**
	 * Date格式化字符串 yyyy-MM-dd
	 */
	private static final String DATE_FORMAT = DatePattern.NORM_DATE_PATTERN;

	/**
	 * Time格式化字符串 HH:mm:ss
	 */
	private static final String TIME_FORMAT = DatePattern.NORM_TIME_PATTERN;

	@Bean
	@Primary
	public ObjectMapper serializingObjectMapper() {
		ObjectMapper objectMapper = new ObjectMapper();
		JavaTimeModule javaTimeModule = new JavaTimeModule();
		javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
		javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
		javaTimeModule.addSerializer(LocalDate.class,  new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
		javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
		javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
		javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
		objectMapper.registerModule(javaTimeModule);
		objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
		return objectMapper;
	}

}
  1. LocalDateTimeDeserializer
package com.zoomlgd.config;

import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.apache.commons.lang.StringUtils;

import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

/**
 * @author DepengZhang
 * @date 2021年12月11日 0:08
 */
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
	/**
	 * DateTime格式化字符串 yyyy-MM-dd HH:mm:ss
	 */
	private static final String DATETIME_FORMAT = DatePattern.NORM_DATE_PATTERN;
	private static final ZoneId DEFAULT_ZONE_ID = ZoneId.of("UTC");
	private static final ZoneId SYSTEM_ZONE_ID = ZoneId.of("Asia/Shanghai");
	private static final String T = "T";
	private static final String Z = "Z";

//	public LocalDateTimeDeserializer() {
//		super(LocalDateTime.class);
//	}

	@Override
	public LocalDateTime deserialize(final JsonParser parser,
									 final DeserializationContext context) throws IOException {
		String value = parser.getValueAsString();
		// 处理标准格式的时间
		if (StringUtils.isNotBlank(value) && value.length() >= DATETIME_FORMAT.length() + 1) {
			if (!value.contains(T) || !value.endsWith(Z)) {
				StringBuilder str = new StringBuilder(value);
				str.replace(10, 11, T);
				str.append(Z);
				return LocalDateTime.ofInstant(Instant.parse(str.toString()), DEFAULT_ZONE_ID);
			}
		} else if (StringUtils.isBlank(value)) {
			throw new NullPointerException("时间字符串不能为空");
		}
		// 处理UTC格式的时间
		return LocalDateTime.ofInstant(Instant.parse(value), DEFAULT_ZONE_ID)
				.atZone(DEFAULT_ZONE_ID).withZoneSameInstant(SYSTEM_ZONE_ID).toLocalDateTime();
	}
}

  1. LocalDateTimeSerializer
package com.zoomlgd.config;

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

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @author DepengZhang
 * @date 2021年12月11日 0:03
 */
public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {

//	public LocalDateTimeSerializer() {
//		super(LocalDateTime.class);
//	}

	@Override
	public void serialize(final LocalDateTime value,
						  final JsonGenerator generator,
						  final SerializerProvider provider) throws IOException {
		System.out.println("---------" + value + "---------");
		if (value != null) {
			generator.writeString(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
		} else {
			generator.writeNull();
		}
	}

}

  1. RestTemplateFactory 告诉RestTemplate接收到返回值,走咱们自己定义的解析器里
package com.zoomlgd.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * @author Depeng Zhang
 * @date 2022年03月08日 20:11
 */
@Configuration
public class RestTemplateFactory {

    @Resource(name = "serializingObjectMapper")
    private ObjectMapper objectMapper;

    @Bean
    public RestTemplate createRestTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        jsonConverter.setObjectMapper(objectMapper);
        restTemplate.getMessageConverters().add(0, jsonConverter);
        return restTemplate;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值