当前位置: 首页 > news >正文

建站制作企业网站seo课程

建站制作企业,网站seo课程,桂林网警,行政事业单位网站建设建议MongoDB 字段中数据类型不一致序列化异常排查与处理 背景如下,因为项目迁移愿意,一个使用Mongodb的业务拥有C#和Java两组Api。Java Api开发和测试都很顺利。上线一段时间后,客服反馈记录都不见了。查看数据库发现,时间字段拥有两…

MongoDB 字段中数据类型不一致序列化异常排查与处理

背景如下,因为项目迁移愿意,一个使用Mongodb的业务拥有C#和Java两组Api。Java Api开发和测试都很顺利。上线一段时间后,客服反馈记录都不见了。查看数据库发现,时间字段拥有两种格式,其中一种是数组类型(如:[636693353404905287, 480]),另一种是日期类型(如:0001-01-01T00:00:00Z)

排查原因

首先看了原有C#代码的逻辑,使用的是DateTimeOffset类型存入的数据库。Java使用的是LocalDateTime类型。经过调用Api测试后,发现使用C#接口创建的数据,是数组格式。接下来就是在Java中对这个Document的序列化进行处理。

解决方案

首先看到[636693353404905287, 480],想到的就是时间戳,第二位应该保存的是时区。写了一个测试方法,将636693353404905287转为LocalDatetime,初步测试,将初始时间1901-01-01,时区偏移为480分钟。经过多种类型的测试,转化为了正确的时间(人工记忆创建记录的时间)。

知道了如何转化,就要在java解析时使用自定义的序列化器。

首先创建List转LocalDateTime的序列化器

import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.List;/***** 包含如下格式脏数据,[636693353404905287, 480], 经测试是旧版c#接口导致的,并试验起始时间是"0001-01-01T00:00:00Z"* 并且此时间戳不需要进行时区转换*/
@ReadingConverter
public class ArrayListToLocalDateTimeConverter implements Converter<List<Object>, LocalDateTime> {@Overridepublic LocalDateTime convert(List<Object> source) {if (source.size() >= 2 && source.get(0) instanceof Long) {long timestamp = (Long) source.get(0);// 假设起始时间是"1601-01-01T00:00:00Z",请根据需要进行调整Instant startInstant = Instant.parse("0001-01-01T00:00:00Z");// 注意:原始时间戳可能需要根据实际情况调整计算方式Instant actualInstant = startInstant.plusMillis(timestamp / 10_000);return LocalDateTime.ofInstant(actualInstant, ZoneOffset.UTC);}throw new IllegalArgumentException("Invalid source for conversion: " + source);}
}

然后在MongoDB的配置类中注册

import com.mongodb.MongoClientURI;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;import java.util.Arrays;@Configuration
public class MongoConfig {@Value("${spring.data.mongodb.uri}")private String uri;@Bean(name = "mongoTemplate")@Primarypublic MongoTemplate mongoTemplate() {MongoTemplate template = new MongoTemplate(mongoDbFactory());customizeMongoTemplate(template);return template;}@Bean@Primarypublic MongoDbFactory mongoDbFactory() {return new SimpleMongoDbFactory(new MongoClientURI(uri));}/*** 为了解决mongodb中的时间戳转换问题*/@Beanpublic MongoCustomConversions mongoCustomConversions() {return new MongoCustomConversions(Arrays.asList(new ArrayListToLocalDateTimeConverter()));}private void customizeMongoTemplate(MongoTemplate template) throws Exception {MappingMongoConverter converter = (MappingMongoConverter) template.getConverter();converter.setCustomConversions(mongoCustomConversions());converter.afterPropertiesSet();}}

uri:其中uri时从配置文件中读取的,mongo 的数据库连接。
mongoTemplate:注入MongoTemplate,用于操作数据库。
mongoCustomConversions:注入自定义的转换器,用于将数据库中的数据转换为Java中的数据。
customizeMongoTemplate:将自定义的转换器注入到MongoTemplate中。

这种是单数据源配置,如果要有多数据源,将MongoTemplate和MongoDbFactory复制,的注入名称修改为不同的名称即可。

总结

经过配置,如果类型是数组,则会触发进行解析。该字段正常的数据可以直接映射。

后续会将C#的流量转发到Java接口,然后将C#接口下线。

http://www.yayakq.cn/news/401386/

相关文章:

  • 深圳网站建设公司设计公司展厅设计图片
  • 群晖如何做网站服务器免费logo制作软件
  • 坊网站建设wordpress 条件查询数据库
  • 温州云海和联欣哪个做网站比较好网上银行官网
  • 什么网站是php做的蚌埠发布刚刚
  • 定州哪里可以做网站在哪里可以学习做网站
  • 12306网站服务时间站长网站优点
  • 有什么网站是做名片印刷的公司的网站 优帮云
  • 织梦网站上传到服务器法律咨询微信网站建设
  • 接平面设计私活的网站金融直播间网站建设
  • 免费空间搭建免费小说网站信息展示网站
  • 广州做网站的网络公司教育培训学校网站建设策划
  • 有哪些网站是用vue做的图片 展示 网站模板
  • 旅行社erp管理系统使用seo专业技术培训
  • 网站注入木马贵阳做网站建设最好的是哪家
  • 网站建设如何做好整体色彩搭配百安居装修官网
  • 辽宁网站建设网站注册页面怎么做数据验证
  • 深圳建站公司是国企吗网站建设设计哪个济南兴田德润简介
  • 建网站的流程费用网站制作学费多少钱
  • 东八区网站建设wordpress 安装 乱码
  • 宝安做棋牌网站建设芜湖网站建设推广
  • 网站开发哪一门语言更快做招商加盟网站
  • 教做美食的网站江西省城乡和住房建设厅网站
  • 女人与黑狗做视频网站深圳网站建设公司 犀牛云 移动云网站
  • 网站设计岗位做哪些事情wordpress 图片命名
  • 账号权重查询入口站长工具广州网站建设模板制作
  • 网站建设公司账户搭建怎么搭建自己的网站服务器
  • 网站建好怎么发布龙岩天宫山住宿
  • 手机能看的你们知道的拼多多seo怎么优化
  • 公司建设网站的手续上海人才网官网招聘招聘