整理了iava新日期LocalDateTime系列类型在springweb中类型转换的问题

直接使用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());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值