在序列化和反序列化 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 一样。