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

标签 java mongodb serialization mapping fasterxml

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

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

如果我的 java 类有一个日期字段,它会使用 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 日期类型,因此我的索引不起作用。

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

最佳答案

我在使用新版本的 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 - 我可以使用 fastxml 将日期写入 ISODate 以使用即将到期的 mongodb 索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14690906/

相关文章:

java - Servlet 中的常规类

java - 如何使用来自 Mongodb 和 PostgreSQL 的数据作为内存中查找表?

JQuery - 附加到序列化

c# - 是否可以使用反序列化进行构造函数注入(inject)?

c# - 在 C# 中将 JSON 数组反序列化为对象

Java Unsafe.copyMemory java.lang.IllegalArgumentException 异常

java - 自动生成时间戳作为数据库的 Id?

java - Tomcat 应用程序管理器的默认用户名密码

mongodb - 如何使用php计算mongo集合中的文档元素?

arrays - 如何使用go从mongoDB数组中获取所有元素?