import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.*;
@Configuration
public class MongoConfig implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
MongoConverter converter = mongoTemplate.getConverter();
if (converter.getTypeMapper().isTypeKey("_class")) {
((MappingMongoConverter) converter).setTypeMapper(new DefaultMongoTypeMapper(null));
}
}
/**
* 其他方式注解在参数上无法实现
* 这里mongodb实现了对时间转换注解类的引用,可以实现对应的类型转换功能
*/
@Bean
public MongoCustomConversions customConversions() {
return MongoCustomConversions.create(i -> {
i.registerConverter(new BsonTimestampToLocalDateTimeConvert());
i.registerConverter(new LocalDateTimeToBsonTimestampConvert());
});
}
}
import org.springframework.core.convert.converter.Converter;
import org.bson.BsonTimestamp;
import org.bson.codecs.BsonTimestampCodec;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
@ReadingConverter
@WritingConverter
public class LocalDateTimeToBsonTimestampConvert implements Converter<LocalDateTime, BsonTimestamp> {
@Override
public BsonTimestamp convert(LocalDateTime localDateTime) {
if (null != localDateTime) {
//时区看情况决定,特别注意,时区会导致时间不准确的情况出现
return new BsonTimestamp(localDateTime.toInstant(ZoneOffset.UTC).toEpochMilli());
}
return null;
}
}