首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mongojack: ObjectId的十六进制表示形式无效

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

Stack Overflow用户
提问于 2021-05-18 05:19:53
回答 1查看 498关注 0票数 1

目标

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

代码语言:javascript
运行
复制
{
 "_id": "840617013772681266",
 "messageCount": 69420,
 "seedCount": 18,
 "prefix": "f!",
 "language": "en"
}

问题

取而代之的是,我在控制台中得到了这个错误。

代码语言:javascript
运行
复制
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

代码

这是当我尝试在db中创建一个新的Guild时调用的代码:

代码语言:javascript
运行
复制
    public static Guild getGuild(String id) throws ExecutionException {
        return cache.get(id);
    }

cache如下(load get executed):

代码语言:javascript
运行
复制
    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方法:

代码语言:javascript
运行
复制
    public static Optional<Guild> findGuild(String id) {
        return Optional.ofNullable(guildCollection.find()
                .filter(Filters.eq("_id", id)).first());
    }

最后是Guild文档。

代码语言:javascript
运行
复制
@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之后,我得到的问题比答案还多。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-18 05:27:21

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

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

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

Ruby中的示例:

代码语言:javascript
运行
复制
irb(main):011:0> (v = '%x' % 840617013772681266) + '0' * (24 - v.length)
=> "baa78b862120032000000000"

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67577149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档