接原文章LocalDateTime接收前端日期参数差8个小时、无法解析、返回前端带T等疑难杂症解决方案
把反序列化改写了一下,前几个和原文章差不多:
- 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;
}
}
- 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();
}
}
- 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();
}
}
}
- 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;
}
}