Question

J'ai une table postgres -

CREATE TABLE "Contest"
(
  id serial NOT NULL,
  name varchar(100) NOT NULL,
  type char(1) NOT NULL,
  status char(1) NOT NULL,
  ...
)

J'essaie d'obtenir les valeurs des champs type et status retour à mon application Play 2.x (Anorm) :

 val parseContest = {
  get[Pk[Int]]("id") ~
  get[String]("name") ~
  get[Char]("type") ~
  get[Char]("status") map {
  case id~name~c_type~status =>
    Contest(id, name, c_type, status)
  }
}

et j'obtiens l'erreur :

could not find implicit value for parameter extractor: anorm.Column[Char]

On dirait que 'Char' n'est pas pris en charge par anorm.Que dois-je changer dans mon code ?Est-ce une bonne pratique d'utiliser get[String]("status") et puis status.head comme solution de contournement ?

Était-ce utile?

La solution

Je pense que vous pourriez écrire un convertisseur implicite pour votre char Colonnes.Cela ressemblerait à ceci :

implicit def columnToChar: Column[Char] = {
    Column[Char](transformer = {
      (value, meta) =>
        val MetaDataItem(qualified, nullable, clazz) = meta
        value match {
          case ch: String => Right(ch.head)
          case _ => Left(TypeDoesNotMatch("Cannot convert " + value + " to Char for column " + qualified))
        }
    })
  }

Assurez-vous ensuite que ce convertisseur est dans le champ d'application.

Je ne suis pas sûr que la valeur soit une chaîne mais vous pouvez la vérifier et apporter les corrections correspondantes.

Autres conseils

Il y a récemment eu une fusion de relations publiques sur Anorm à ce sujet : https://github.com/playframework/playframework/pull/2189

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top