Проблема с mondogb-morphia в приложении Grails для правильного хранения карты в базе данных

Я использую плагин mongodb-morphia (0.7.8) в приложении Grails (2.0.3) и экспериментирую с проблемой типа Map. Я хочу сохранить в своей базе данных карту типа Map, но когда я помещаю ее в свой файл groovy:

class ServiceInfo {

    String name

    Map<String,?> args

    Date dateCreated // autoset by plugin
    Date lastUpdated // autoset by plugin

    static constraints = {
        name nullable:false
    }
}

Я получаю следующую ошибку:

2012-04-29 14:39:43,876 [pool-2-thread-3] ОШИБКА MongodbMorphiaGrailsPlugin - Ошибка обработки артефакта домена mongodb > fr.unice.i3s.modalis.yourcast.provider.groovy.ServiceInfo: неизвестный тип... довольно плохо... зови на помощь, маши руками... ага!

Я попытался просто указать карту в своем файле:

Map args

В этом случае я получаю следующее простое предупреждение:

ИНФОРМАЦИЯ: MapKeyDifferentFromString пожаловался на fr.unice.i3s.modalis.yourcast.provider.groovy.ServiceInfo.args: карты не могут быть закодированы с помощью Object (Map); Используйте параметризованный тип, который поддерживается (Map)

и когда я пытаюсь сохранить объект, атрибут args просто пропускается в базе данных. Для информации мои объекты имеют такое представление:

def icalReader= new ServiceInfo(name:"IcalReader", args:['uri':DEFAULT_URL, 'path':"fr.unice.i3s.modalis.yourcast.sources.calendar.icalreader/"])
icalReader.save()

Наконец, если я просто скажу, что args — это список:

List args

И я меняю свои объекты, чтобы взять список только с одной картой, у меня просто предупреждение:

ВНИМАНИЕ: Многозначное поле 'fr.unice.i3s.modalis.yourcast.provider.groovy.ServiceInfo.args' может быть гетерогенной коллекцией. Это невозможно проверить. Пожалуйста, объявите допустимый тип, чтобы избавиться от этого предупреждения. нулевой

но все работает нормально, и моя карта правильно хранится в базе данных:

{ "_id" : ObjectId("4f9be39f0364bf4002cd48ad"), "name" : "IcalReader", "args" : [ { "path" : "fr.unice.i3s.modalis.yourcast.sources.calendar.icalreader/", " uri" : "http://localhost:8080/" } ], "dateCreated" : ISODate("2012-04-28T12:33:35.838Z"), "lastUpdated" : ISODate("2012-04-28T12:33 :35.838Z") }

Так есть что-то, что я забыл в определении моей карты? Мой сервис работает, но мне не нравятся хаки типа «инкапсулировать карту в список для ее сериализации»;)


person Simon Urli    schedule 29.04.2012    source источник


Ответы (1)


Я не знаю о Map, но не могли бы вы вместо этого использовать встроенную модель данных?

class ServiceInfo {
...
@Embedded
MyArgs args
...
}

class MyArgs {
String key
String value
}
person niko.makela    schedule 11.06.2012