Mongojack: недопустимое шестнадцатеричное представление ObjectId

Цель

Я пытаюсь отправить некоторые данные в базу данных mongo, используя mongojack. Я ожидаю, что результат будет примерно таким в БД:

{
 "_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)) правда в том, что я не полностью понимаю ошибку и после просмотра документация У меня осталось больше вопросов, чем ответов.


person JasperEdits    schedule 17.05.2021    source источник
comment
Пожалуйста, присылайте мне любые вопросы относительно кода, который я не показываю здесь.   -  person JasperEdits    schedule 18.05.2021


Ответы (1)


ObjectId — это 12-байтовое значение, которое обычно представляется как последовательность из 24 шестнадцатеричных цифр. Это не целое число.

Вы можете либо создать значения ObjectId с помощью соответствующего конструктора ObjectId, либо проанализировать строку из 24 шестнадцатеричных цифр. Похоже, вы пытаетесь выполнить целочисленное преобразование в ObjectId, которое обычно не поддерживается.

Технически вы можете преобразовать целое число 840617013772681266 в ObjectId, дополнив его нулями до 12 байтов, но стандартные инструменты драйвера MongoDB не делают этого за вас и рассматривают этот недопустимый ввод (либо как целое число, либо как строку) для преобразования в ObjectId. .

Пример в Руби:

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

Обратите внимание, что хотя результирующее значение можно было бы анализировать как ObjectId, оно не конструируется в соответствии с правилами ObjectId, и поэтому значение не может быть разумно разложено на компоненты ObjectId (идентификатор компьютера, счетчик и случайное значение).

person D. SM    schedule 17.05.2021
comment
Однако идентификатор представляет собой строку, и я пробовал Long.toHexString. Я также пытался использовать конструктор ObjectId, но безрезультатно. Я что-то упустил в вашем ответе 100%. - person JasperEdits; 18.05.2021
comment
840617013772681266 нельзя преобразовать в объектный идентификатор с помощью стандартных инструментов драйвера, независимо от того, хранится ли он в виде строки или целого числа. - person D. SM; 18.05.2021
comment
Как вы рекомендуете мне продолжать использовать метод заполнения нулями, который вы упомянули в своем ответе? - person JasperEdits; 18.05.2021