Я использую плагин 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") }
Так есть что-то, что я забыл в определении моей карты? Мой сервис работает, но мне не нравятся хаки типа «инкапсулировать карту в список для ее сериализации»;)