雨翔河
首页
列表
关于
spring中使用jpa操作mysql和mongodb读写ZonedDateTime字段
2024-01-23 15:02
> LocalDateTime表示本地日期和时间,要表示一个带时区的日期和时间,我们就需要ZonedDateTime。可以简单地把ZonedDateTime理解成LocalDateTime加ZoneId。 在spring使用jpa进行crud操作实体的时候如果用到了ZonedDateTime字段缺少转换类会报错,使用jackson进行json序列化的时候存在ZonedDateTime缺少注册时间模块也会报错。 1.先准备好读写转换类 写转换类: ``` import org.springframework.data.convert.WritingConverter; import org.springframework.core.convert.converter.Converter; import java.time.LocalDateTime; import java.time.ZonedDateTime; @WritingConverter public class ZonedDateTimeToLocalDateTimeWriteConverter implements Converter<ZonedDateTime, LocalDateTime> { @Override public LocalDateTime convert(ZonedDateTime source) { return source.toLocalDateTime(); } } ``` 读转换类 ``` import org.springframework.core.convert.converter.Converter; import org.springframework.data.convert.ReadingConverter; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; @ReadingConverter public class ZonedDateTimeToLocalDateTimeReadConverter implements Converter<LocalDateTime, ZonedDateTime> { @Override public ZonedDateTime convert(LocalDateTime source) { return source.atZone(ZoneId.systemDefault()); } } ``` 2.增加使用jpa的mysql操作对ZonedDateTime的配置: ``` import com.xxx.ZonedDateTimeToLocalDateTimeReadConverter; import com.xxx.ZonedDateTimeToLocalDateTimeWriteConverter; import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration; import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.List; @Component public class XxxJdbcConfiguration extends AbstractJdbcConfiguration { @Override protected List<?> userConverters() { return Arrays.asList(new ZonedDateTimeToLocalDateTimeReadConverter(), new ZonedDateTimeToLocalDateTimeWriteConverter()); } } ``` 3.增加使用jpa的mongodb操作对ZonedDateTime的配置: ``` import org.springframework.context.annotation.Bean; import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import org.springframework.stereotype.Component; import org.springframework.core.convert.converter.Converter; import java.util.ArrayList; import java.util.List; /** * mongodb增加ZonedDateTime的支持 */ @Component public class MongoCustomConverterConfig { @Bean public MongoCustomConversions mongoCustomConversions() { List<Converter<?, ?>> converters = new ArrayList<>(); converters.add(new ZonedDateTimeToLocalDateTimeReadConverter()); converters.add(new ZonedDateTimeToLocalDateTimeWriteConverter()); return new MongoCustomConversions(converters); } } ``` 4. mysql使用jpa进行crud的实体:注意这里的ReadOnlyProperty注解,因为我这里只有读的情况(创建时间写操作是数据库自动生成的),所以加上这个注解,如果有写的情况请注意ZonedDateTime不允许为空,不然无法转换。 ``` @Id private Long id; @Column("user_id") private String userId; @Column("created_time") @ReadOnlyProperty private ZonedDateTime createdTime; ``` 5. jackson序列化实体的时候记得要添加支持 ``` <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency> import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; ObjectMapper MAPPER = new ObjectMapper(); MAPPER.registerModule(new JavaTimeModule()); ```
类型:工作
标签:ZonedDateTime,spring,jpa,mysql,mongodb,jackson
Copyright © 雨翔河
我与我周旋久
独孤影
开源实验室