Ошибка Mongo/Morphia StackOverflow?

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

@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)

Этот шаблон повторяется снова и снова... Что не так с моей настройкой?


person IAmYourFaja    schedule 04.08.2014    source источник
comment
Вам нужно опубликовать больше, чем просто верхнюю строку трассировки стека. Обычно ошибки StackOverflowError сводятся к бесконечному (или очень длинному) циклу рекурсивных вызовов методов. Сама трассировка должна сказать вам, так ли это, если вы продолжаете видеть повторяющийся шаблон вызовов методов.   -  person JonK    schedule 04.08.2014
comment
Спасибо @JonK (+1) - посмотрите мое обновление!   -  person IAmYourFaja    schedule 04.08.2014
comment
Вам нужно опубликовать либо всю трассировку стека, либо, по крайней мере, указать строку в вашем собственном коде, на которую она ссылается. Это переполнение стека часто происходит, когда у вас есть объект, который содержит другой объект, указывающий на исходный объект. В своем коде вы используете только простые типы (длинные и строковые) — действительно ли это полный код класса, который вы пытаетесь сохранить?   -  person Trisha    schedule 02.09.2014


Ответы (2)


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

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

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

person dsollen    schedule 02.10.2014

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