gpt4 book ai didi

java - 我可以使用 fasterxml 将日期写为 ISODate 以使用即将到期的 mongodb 索引吗?

转载 作者:可可西里 更新时间:2023-11-01 10:33:39 25 4
gpt4 key购买 nike

我正在使用 FasterXML将我的对象映射到 MongoDB

我想使用 expiring index ,但为此,我的文档中需要一个 ISODate 字段。

如果我的 java 类有一个 Date 字段,它会使用 DateSerializer 按数字或字符串序列化,如下所述:http://wiki.fasterxml.com/JacksonFAQDateHandling

我追踪到这个函数:

/**
* Method that will handle serialization of Date(-like) values, using
* {@link SerializationConfig} settings to determine expected serialization
* behavior.
* Note: date here means "full" date, that is, date AND time, as per
* Java convention (and not date-only values like in SQL)
*/
public final void defaultSerializeDateValue(Date date, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
// [JACKSON-87]: Support both numeric timestamps and textual
if (isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)) {
jgen.writeNumber(date.getTime());
} else {
jgen.writeString(_dateFormat().format(date));
}
}

这两条路径都没有最终写入标准的 mongodb 日期类型,因此我的索引不起作用。

有没有办法像从 mongo shell 创建文档时那样强制对 java Date 类型进行序列化?或者,我可以通过“触发器”或类似的东西自动添加字段吗? (目的是完全绕过序列化程序)

最佳答案

我在使用新版本的 FasterXML 时遇到了完全相同的问题。 (2.7.3)。除了序列化器之外,FasterXML 现在有一个“编解码器”来处理对象。我用一个使编解码器无效的序列化程序解决了这个问题,这样日期对象就可以到达 mongo 驱动程序而不会被触摸。

private static class MongoDateSerializer extends JsonSerializer<Date> {

public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
TokenBuffer buffer = (TokenBuffer) jgen;
ObjectCodec codec = buffer.getCodec();
buffer.setCodec(null);

buffer.writeObject(value);

buffer.setCodec(codec);
}
}

查看 buffer.writeObject(value) 这行,旧版本的 FasterXML 就是这样做的。

关于java - 我可以使用 fasterxml 将日期写为 ISODate 以使用即将到期的 mongodb 索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14690906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com