直接使用LocalDateTime是接收不到前端发来的日期参数, 可以使用注解@DateTimeFormat
使用jackson也无法转换LocalDateTime, 需要使用@JsonFormat.
除了使用注解, 还有一种配置的方式, 配置过后不需要添加注解直接就能接收到和转换:
jackson转换:
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.format.Formatter;
import pers.rxiao.accountcommon.constant.LocalDateTimeConstant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class LocalDateTimeConfig {
/**
* localDateTime的序列化和反序列化配置
*
* @return 设定好的序列化和反序列化格式
*/
public static JavaTimeModule serializerAndDeserializer() {
JavaTimeModule javaTimeModule = new JavaTimeModule();
// 序列化
javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
// 反序列化
javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
return javaTimeModule;
}
}
springweb接收:
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.format.Formatter;
import pers.rxiao.accountcommon.constant.LocalDateTimeConstant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class LocalDateTimeConfig {
/**
* 接口参数接受日期转localDateTime类型配置
*
* @return 日期格式化类型对象
*/
public static Formatter<LocalDateTime> localDateTimeFormatter() {
return new Formatter<LocalDateTime>() {
/**
* 解析参数
*
* @param text 传入日期字符串参数
* @param locale 地区
* @return 解析后的日期
*/
@Override
public LocalDateTime parse(String text, Locale locale) {
return LocalDateTime.parse(text, DateTimeFormatter.ofPattern(LocalDateTimeConstant.LOCAL_DATE_TIME, locale));
}
/**
* 这个暂时不知道怎么使用, 也不知道干什么的...
*
* @param object 日期
* @param locale 地区
* @return 输出字符串
*/
@Override
public String print(LocalDateTime object, Locale locale) {
return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(object);
}
};
}
}
最后再将他们配置进springbean
/**
* 日期配置类
*/
@Configuration
public class LocalDateTimeConfig {
/**
* json日期接收配置
* 也可以在实体类日期字段加上@JsonFormat注解, 注解shape属性值可以设置为string, 然后在pattern属性设置格式
* 但是注解方式需要在每个实体类的每个日期字段添加, 过于繁琐, 这里是统一的配置
*
* @return Jackson 2对象映射器生成器
*/
@Bean
public ObjectMapper serializingObjectMapper() {
return Jackson2ObjectMapperBuilder.json().modules(LocalDateTimeConfig.serializerAndDeserializer()).featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build();
}
/**
* 接口参数接受日期转localDateTime类型配置
* 也可以在实体类localDateTime类型的字段上加上@DateTimeFormat注解, 注解的iso属性设置为ISO.DATE_TIME或ISO_LOCAL_DATE_TIME
* pattern属性为日期解析格式. 这里的配置是统一的配置
*
* @return 日期格式化类型对象
*/
@Bean
public Formatter<LocalDateTime> localDateTimeFormatter() {
return LocalDateTimeConfig.localDateTimeFormatter();
}
}
jackson还需要最后配置一下:
/**
* json转换工具类
*/
public class JsonUtils {
private static final ObjectMapper objectMapper = new ObjectMapper();
static {
// 忽略null的字段
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 忽略空bean转json错误
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// 忽略在json中存在而java对象中不存在的属性
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 序列化和反序列化localDateTime系列日期
objectMapper.registerModule(LocalDateTimeConfig.serializerAndDeserializer());
}
}