2013-09-16 3 views
5

Я использую Play 2.1.4 против postgresql db. В postgresql db я использую uuid как my pk datatype, который коррелирует с java.util.UUID. Функция SqlParser.getT в анормах не имеет неявного экстрактора для java.util.UUID. Это имеет смысл, потому что я не думаю, что многие люди используют его; однако я не могу найти инструкции о том, как я могу добавить его. Кто-нибудь знает, как добавить дополнительный неявный экстрактор в anorm.SqlParser в Play?Как добавить дополнительный неявный экстрактор в Play 2.1.4 и на самом деле использовать его?

Ошибка я получаю ниже:

не может найти неявное значение для извлечения параметров: anorm.Column [java.util.UUID]

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

case class App(appId: UUID, appName: String, appServerName: String, 
       appComponent: String, appDescription: String, 
       appDateCreated: DateTime, appDateModified: DateTime, 
       appValidated: Boolean) 

val app = { 
    get[UUID]("app_id") ~ 
    get[String]("app_name") ~ 
    get[String]("app_server_name") ~ 
    get[String]("app_component") ~ 
    get[String]("app_description") ~ 
    get[java.util.Date]("app_date_created") ~ 
    get[java.util.Date]("app_date_modified") ~ 
    get[Boolean]("app_validated") map { 
     case id ~ name ~ serverName ~ component ~ description ~ dateCreated ~ 
     dateModified ~ validated => App(id, name, serverName, component, 
     description, new DateTime(dateCreated.getTime), 
     new DateTime(dateModified.getTime), validated) 
    } 
    } 

def all(): List[App] = DB.withConnection { implicit conn => 
    SQL("SELECT * FROM apps").as(app *) 
} 
+0

[Этот ответ] (http://stackoverflow.com/questions/11388301/joda-datetime-field-on-play-framework-2-0s-anorm) должен помочь вам начать работу, хотя речь идет о преобразовании JodaTime. – maba

ответ

5

Возможно, this post будет полезным. (. Используется в моем проекте работает нормально)

/** 
    * Attempt to convert a SQL value into a UUID 
    * 
    * @param value value to convert 
    * @return UUID 
    */ 
    private def valueToUUIDOption(value: Any): Option[UUID] = { 
    try { 
     valueToByteArrayOption(value) match { 
     case Some(bytes) => Some(UUIDHelper.fromByteArray(bytes)) 
     case _ => None 
     } 
    } 
    catch { 
     case e: Exception => None 
    } 
    } 
/** 
    * Implicit conversion from UUID to anorm statement value 
    */ 
    implicit def uuidToStatement = new ToStatement[UUID] { 
    def set(s: java.sql.PreparedStatement, index: Int, aValue: UUID): Unit = s.setObject(index, aValue) 
    } 
/** 
    * Implicit converstion from anorm row to uuid 
    */ 
    implicit def rowToUUID: Column[UUID] = { 
    Column.nonNull[UUID] { (value, meta) => 
     val u = UUID.fromString(value.toString) 
     val MetaDataItem(qualified, nullable, clazz) = meta 
     valueToUUIDOption(value) match { 
     case Some(uuid) => Right(uuid) 
     case _ => Left(TypeDoesNotMatch("Cannot convert " + value + ":" + value.asInstanceOf[AnyRef].getClass + " to UUID for column " + qualified)) 
     } 
    } 
    } 
+0

Ты джентльмен и ученый. Это отлично поработало. Мне пришлось немного изменить его, потому что я использую его с postgresql, который возвращает UUID как тип данных, а не массив байтов; однако, видя, что ваш код дал мне ОГРОМНУЮ ногу, выяснив, как делать то, что я хотел сделать, и теперь я могу использовать либо БД, что это фантастика. Спасибо. – jlegler

+0

@jlegler - SO - место для помощи другим;) –

7

Вот упрощенная вариация @ r.piesnikowski ответа на драйвер JDBC, который возвращает java.util.UUID, как PostgreSQL делает:

/** 
    * Implicit conversion from UUID to Anorm statement value 
    */ 
    implicit def uuidToStatement = new ToStatement[UUID] { 
    def set(s: java.sql.PreparedStatement, index: Int, aValue: UUID): Unit = s.setObject(index, aValue) 
    } 

    /** 
    * Implicit conversion from Anorm row to UUID 
    */ 
    implicit def rowToUUID: Column[UUID] = { 
    Column.nonNull[UUID] { (value, meta) => 
     value match { 
     case v: UUID => Right(v) 
     case _ => Left(TypeDoesNotMatch(s"Cannot convert $value:${value.asInstanceOf[AnyRef].getClass} to UUID for column ${meta.column}")) 
     } 
    } 
    } 
+0

Ваша версия отлично подходит для меня, в отличие от @ r.piesnikowski's. Есть ли разница между ними? –

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

  • Нет связанных вопросов^_^