2015-05-12 2 views
0

У меня есть следующие классы случай:SalatDAO десериализации типизированного класса со списком

case class Network(val name : String, val mac : String) 
case class Field[T](var value : T, var source : String = "") 
case class Device(var _id : ObjectId = new ObjectId, 
        var device_type : Field[String] = Field[String](""), 
        var networks : Field[List[Network]] = new Field[List[Network]](List[Network]())) { 
    def hasMac(mac : String) : Boolean = { 
    networks.value.foreach { n => if(n.mac == mac) return true } 
    return false 
    } 
} 

Я могу сериализовать/deserialze экземпляров устройства. Однако, после того, как deserializtion метод hasMac разбился с исключением: «ClassCastException: com.mongodb.BasicDBList не может быть приведен к scala.collection.immutable.List»

Когда класс устройств определяется как этот

case class Device(var _id : ObjectId = new ObjectId, 
        var device_type : Field[String] = Field[String](""), 
        var networks : List[Network] = List[Network]()) { 
    def hasMac(mac : String) : Boolean = { 
    networks.foreach { n => if(n.mac == mac) return true } 
    return false 
    } 
} 

У меня ошибка, и все работает так, как ожидалось.

Я видел, что salat не поддерживает Option [List], но здесь у меня есть поле [Список]. я не мог понять из этой страницы, если намаз поддерживает этот вид типа: https://github.com/novus/salat/wiki/SupportedTypes

Aliza

ответ

1

Salat проявитель здесь.

Похоже Field[List[Network]] не сериализации должным образом, в первую очередь - BasicDBList последняя Монго-Джава-водитель канавы попытка сериализовать объект, рассматривая его как кортеж, который получает сохранялся как BasicDBList.

(И не будет ли это смущать всех, если вы можете сказать, что mongo-java-driver просто взорвется, когда он сталкивается с чем-то, что он не знает, как сериализоваться, а не преобразовывать его в список и откладывать проблема, пока не подозревающий пользователь не попытается десериализовать документ?)

Вот тест, показывающий параметризованный класс case, содержащий список, параметризованный для того же типа.

https://github.com/novus/salat/blob/master/salat-core/src/test/scala/com/novus/salat/test/SortedSeqSpec.scala#L44-L49

Однако, я не могу найти спецификации доказывающих, что случай класс параметризованного к List[Foo[X]] будет работать.

Пожалуйста подать билет на https://github.com/novus/salat/issues

Спасибо.

+0

Что заставляет вас думать Поле [String] не получает сериализацию должным образом? В документе в БД у меня есть «device_type»: { «value»: «mobile», «source»: «x1» }, поэтому он получил серллизацию должным образом. Проблема заключается в поле [Список [Сеть]] – Aliza

+0

Отредактированный оригинальный ответ – prasinous

0

Я также столкнулся с той же проблемой. Я работал почти неделю. Но, наконец, решение заставляет меня смеяться. Я просто помещаю все основные классы классов, дочерние сущности в один файл. Технически я не знаю, как это разрешилось. Но мне нравится делиться своим опытом.

Смежные вопросы