1

在序列化和反序列化 AVRO 格式的数据时处理日期字段时,我遇到了一个非常奇怪的问题。

我们有一个 JPA 实体定义如下

@Entity
public class Person implements Serializable{
    @Column(name = "DOB")
    @Temporal(TemporalType.DATE)
    protected Date dob;

我们读取 JSON 格式的有效负载,可以在持久化数据之前将其反序列化为上述实体。之后,如果我像这样查询数据库

  select * from Persons where dob='01-JAN-2019' -- I get records

但是,如果它是 AVRO,则不是 JSON,而是通过 HTTP 将其发送到服务,在那里它被读取并转换为实体并持久化,当记录被持久化时,我会得到状态。但是,如果我运行相同的 SELECT,除非我明确说明,否则我看不到数据

  select * from Persons where to_date(dob)='01-JAN-2019'.

但是,如果我在我的机器上本地运行相同的代码库,它就像一个魅力,但部署到我们的 DIT 和其他区域的相同代码,它不起作用。

有没有人遇到过类似的问题?

我添加了一个代理数据源并启用了 net.ttddyy.dsproxy.support.ProxyDataSource 的日志记录。

当它在本地和远程运行时,日志是完全相同的。

在 JSON 的情况下

Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JSONDateDeserializer()).create();
JsonReader reader = new JsonReader(is); //where is InputStreamReader(ServletInputStream)
reader.beginArray();
while(reader.hasNext()){

   Person p = gson.fromJson(reader,Person.class);
   repository.save(p); //This works fine
 ..........

JSONDateDeserializer has custom Deserialize logic. 

在 AVRO 的情况下

 AvroMapper avroMapper = new AvroMapper();
 AvroSchema schema = avroMapper.schemaFor(Person.class);
 objectReader = avroMapper.readerFor(Person.class)
       .with(schema);
 MappingIterator<Person> mi = objectReader.readValues(is); //read from servletInputStream
 mi.forEachRemaining(p->repository.save(p)); //Data is saved, but date field is behaving differently

我认为,应该有一种方法来注册自定义日期序列化器和反序列化器,就像 JsonDateDeserializer 一样。

4

0 回答 0