2016-07-22 4 views
0

Я работаю над API-интерфейсом Rest, используя Scala-Spray - Sorm. Я пытаюсь реализовать инфраструктуру Sorm в существующей базе данных. Сохранение, обновление и удаление уже работает отлично, но когда я пытаюсь запросить что-то из базы данных, это дает мне:Spray/Sorm дает несоответствие типа аргумента

[ERROR] [07/22/2016 09:57:14.377] [on-spray-can-akka.actor.default- 
dispatcher-5] [akka://on-spray-can/user/growficient-api] argument type mismatch: 
Incorrect values of parameter types: 
- long: 
| class java.lang.Long: 
| 91 
- class java.lang.String: 
| class org.joda.time.LocalDate: 
| 2016-04-08 
- class java.lang.String: 
| class org.joda.time.LocalTime: 
| 12:55:27.000 
- int: 
| class java.lang.Integer: 
| 0 
- int: 
| class java.lang.Double: 
| 2155.0 
- int: 
| class java.lang.Integer: 
| 22 
- int: 
| class java.lang.Integer: 
| 35 
- int: 
| class java.lang.Integer: 
| -65 

Моя модель:

object Samples extends DefaultJsonProtocol with SprayJsonSupport { 
    implicit object samplesFormat extends RootJsonFormat[Samples] { 
    override def read(value: JsValue) = { 
     println(value) 
     value.asJsObject.getFields("gatewayid", "sensorid", "date", "time", "wc", "ec", "temp", "battery", "rssi") match { 
     case Seq(
      JsString(gatewayid), 
      JsString(sensorid), 
      JsString(date), 
      JsString(time), 
      JsNumber(wc), 
      JsNumber(ec), 
      JsNumber(temp), 
      JsNumber(battery), 
      JsNumber(rssi) 
     ) => 
      new Samples(gatewayid, sensorid, date, time, wc.toInt, ec.toInt, temp.toInt, battery.toInt, rssi.toInt) 
     case _ => throw new DeserializationException(s"$value is not properly formatted") 
     } 
    } 

    override def write(s: Samples) = JsObject(
     "gatewayid" -> JsString(s.gatewayid), 
     "sensorid" -> JsString(s.sensorid), 
     "date" -> JsString(s.date), 
     "time" -> JsString(s.time), 
     "wc" -> JsNumber(s.wc), 
     "ec" -> JsNumber(s.ec), 
     "temp" -> JsNumber(s.temp), 
     "battery" -> JsNumber(s.battery), 
     "rssi" -> JsNumber(s.rssi) 
    ) 
    } 
} 

case class Samples(gatewayid: String, sensorid: String, date: String, time: String, wc: Int, ec: Int, temp: Int, battery: Int, rssi: Int) 

Сейчас для целей тестирования я я просто делаю простой запрос, чтобы получить все:

object DB extends Instance(
    entities = Set(
     Entity[Samples]() 
    ), 
    url = s"jdbc:mysql://$addr:$port/$database", 
    user = username, 
    password = password, 
    initMode = InitMode.Create 
) 

    DB.query[Samples].fetch().toList 

К сожалению, он сбой при запросе с заданным выходом ошибки. Я понимаю, что что-то получает неправильные типы параметров, но я не могу понять, что.

Я был бы очень признателен, если бы кто-нибудь мог указать мне в правильном направлении.

ответ

1

Виновником есть:

- class java.lang.String: 
| class org.joda.time.LocalDate: 
| 2016-04-08 
- class java.lang.String: 
| class org.joda.time.LocalTime: 
| 12:55:27.000 

Вы должны использовать предлагаемые типы Joda вместо строки на полях в соответствии.

+0

Спасибо! Я изменил все, чтобы использовать типы Joda, и заметил, что мне также необходимо изменить один параметр на Double. Это решило мою проблему – sergei