Mongojack:ObjectId 的无效十六进制表示

Mongojack: invalid hexadecimal representation of an ObjectId

目标

我正在尝试使用 mongojack 将一些数据推送到 mongo 数据库。 我希望数据库中的结果是这样的:

{
 "_id": "840617013772681266",
 "messageCount": 69420,
 "seedCount": 18,
 "prefix": "f!",
 "language": "en"
}

问题

相反,我在控制台中收到此错误。

Caused by: java.lang.IllegalArgumentException: invalid hexadecimal representation of an ObjectId: [840617013772681266]
    at org.bson.types.ObjectId.parseHexString(ObjectId.java:390)
    at org.bson.types.ObjectId.<init>(ObjectId.java:193)
    at org.mongojack.internal.ObjectIdSerializer.serialiseObject(ObjectIdSerializer.java:66)
    at org.mongojack.internal.ObjectIdSerializer.serialize(ObjectIdSerializer.java:49)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770)
    ... 59 more

代码

这是我尝试在数据库中创建新公会时调用的代码:

    public static Guild getGuild(String id) throws ExecutionException {
        return cache.get(id);
    }

cache 如下(加载执行):

    private static LoadingCache<String, Guild> cache = CacheBuilder.newBuilder()
            .expireAfterAccess(10, TimeUnit.MINUTES)
            .build(
                    new CacheLoader<>() {
                        @Override
                        public Guild load(@NotNull String id) {
                            return findGuild(id).orElseGet(() -> new Guild(id, "f!"));
                        }
                    });

首先调用的findGuild方法:

    public static Optional<Guild> findGuild(String id) {
        return Optional.ofNullable(guildCollection.find()
                .filter(Filters.eq("_id", id)).first());
    }

最后 Guild 文档。

@Getter
@Setter
public class Guild implements Model {

    public Guild(String id, String prefix) {
        this.id = id;
        this.prefix = prefix;
    }

    public Guild() {
    }

    private String id;

    /*
    If a Discord guild sent 1,000,000,000 messages per second,
    it would take roughly 292471 years to reach the long primitive limit.
     */
    private long messageCount;

    private long seedCount;

    // The default language is specified in BotValues.java's bot.yaml.
    private String language;

    private String prefix;

    @ObjectId
    @JsonProperty("_id")
    public String getId() {
        return id;
    }

    @ObjectId
    @JsonProperty("_id")
    public void setId(String id) {
        this.id = id;
    }
}

我试过的

我已经尝试了很多事情,比如做 Long.toHexString(Long.parseLong(id)) 事实是我不完全理解这个错误,在看到 documentation 我留下的问题多于答案。

ObjectId 是一个 12 字节的值,通常表示为 24 个十六进制数字的序列。不是整数。

您可以使用适当的 ObjectId 构造函数创建 ObjectId 值,也可以解析 24 位十六进制数字的字符串。您似乎正在尝试执行到 ObjectId 的整数转换,这通常不是受支持的操作。

从技术上讲,您可以将整数 840617013772681266 转换为 ObjectId,方法是将其零填充为 12 个字节,但标准 MongoDB 驱动程序工具不会为您执行此操作,并将此输入视为无效 (作为整数或字符串)以转换为 ObjectId。

Ruby中的示例:

irb(main):011:0> (v = '%x' % 840617013772681266) + '0' * (24 - v.length)
=> "baa78b862120032000000000"

请注意,虽然生成的值可以解析为 ObjectId,但它不是按照 ObjectId 规则构造的,因此该值无法合理地分解为 ObjectId 组件(机器 ID、计数器和随机值)。