Монго / Morphia StackOverflow ошибка?

1

У меня есть следующее лицо:

@Entity("platform_defs")
class PlatformDef {
    @Id
    Long id

    @Property("name")
    String name

    @Property("abbreviation")
    String abbreviation

    @Property("type")
    String type

    @Property("hg_repo")
    String hgRepo

    @Property("port")
    Long port

    @Property("status")
    String status
}

И следующий код Morphia пытается сохранить экземпляр этого объекта:

public void savePlatformDef(PlatformDef pDef) {
    try {
        AppConfig config = getConfig();
        String dbName = config.getMongo().getDatabaseName();
        Mongo mongo = new Mongo(config.getMongo().getHost(), config.getMongo().getPort());
        morphia = new Morphia();
        datastore = morphia.createDatastore(mongo, dbName);
        morphia.map(PlatformDef.class);
        datastore.save(pDef);
    } catch(Throwable t) {
        System.out.println(t.getMessage());
    }
}

Когда я запускаю это, я получаю:

java.lang.StackOverflowError

Вот рекурсивный список вызовов:

at org.mongodb.morphia.mapping.EmbeddedMapper(toDBObject:40)
at org.mongodb.morphia.mapping.Mapper(writeMappedField:642)
at org.mongodb.morphia.mapping.Mapper(toDBObject:544)
at org.mongodb.morphia.mapping.Mapper(toDBObject:526)

Этот образец повторяется снова и снова... Что случилось с моей настройкой?

  • 2
    Вам нужно будет публиковать не только верхнюю строку трассировки стека. Обычно StackOverflowErrors находятся в бесконечном (или очень длинном) цикле рекурсивных вызовов методов. Сама трассировка должна сообщить вам, если это так, если вы продолжаете видеть повторяющиеся шаблоны вызовов методов.
  • 0
    Спасибо @JonK (+1) - смотрите мое обновление!
Показать ещё 1 комментарий
Теги:
morphia

2 ответа

0

Возможно, слишком поздно, чтобы помочь вам, но я столкнулся с этим вопросом. Я не могу сказать из того, что вы указали в коде, но, скорее всего, вы используете анонимный внутренний класс в какой-то момент в конструкции платформы Def, которую вы передаете вашему методу savePlatformDef. По-видимому, морфия не поддерживает анонимные внутренние классы, они, как известно, вызывают переполнение стека именно так. См. Эту ошибку:

https://github.com/mongodb/morphia/issues/402

Надеюсь, этот ответ поможет другим, как я, в будущем :)

-2
  1. Используйте ObjectId для вашего @Id
  2. Вам не нужно комментировать атрибуты, если вам не требуется другое имя, кроме имени переменной
  3. Используйте MongoClient вместо Mongo, который устарел/уже удален в зависимости от вашей версии драйвера Mongo Java
  4. Почему вы открываете новое соединение с базой данных для каждой операции сохранения? Это довольно дорого и не нужно, так как драйвер Java автоматически объединит их для вас

Ещё вопросы

Сообщество Overcoder
Наверх
Меню