2016-05-29 16 views
0

Ich habe eine Registrierung Aktion, die nach User-E-Mails fragt, in meiner Postgres-Datenbank erlaube ich nur eindeutige E-Mails. Wenn ich in einer doppelten E-Mail setzen erhalte ich die Fehlermeldung zurückScala slick wie kann ich meine eigene zurückgeben Fehlermeldung

**Failure(org.postgresql.util.PSQLException: ERROR: duplicate key value violates 
unique constraint "same_name_profiles_email" 
     Detail: Key (email)=([email protected]) already exists.)** 

Ich mag würde meine eigene generische Fehlermeldung statt zurückzukehren, etwas ähnliches, was sie hier How to catch slick postgres exceptions for duplicate key value violations tun. Die Frage, die ich gegenüber habe ist, dass ich einen Fehler von

**constructor cannot be instantiated to expected type; 
found : akka.actor.FSM.Failure 
required: scala.util.Try[Int]** 

bin immer Was ich tun möchte, ist die Fehlermeldung Code und sqlState Code zu erhalten. Dies ist mein Code

def registration = Action.async {implicit request=> 

     val setup = 
     sqlu"""INSERT Logic""" 

     db.run(setup.asTry).map { result => 
    if(result.isFailure) 
     { 

     result match { 

      case Failure(e: PSQLException) => { 
      //code: if Error I would like to return message below 
      Ok(s"PostgresIntegrityConstraintViolationException, code: ${e.getErrorCode}, sql status: ${e.getSQLState}, message: ${e.getMessage}") 

      } 
     } 


     } 
     Ok(result.toString()) 

     } 

    } 

Jedes Mal, wenn ein Fehler in der Datenbank ist es im Inneren des result.isFailure fällt jetzt würde ich nur die PSQLException ErrorCode- und SQLState erhalten möchte. Ich interessiere mich nicht wirklich für das Zusammenpassen oder irgendetwas. Ich mache das für eine Web-Service-API, also wenn ich zum Beispiel sehe, dass der Fehlercode 23008 mit der doppelten E-Mail übereinstimmt, kann ich dem Benutzer eine generische Nachricht wie "Duplicate Email" geben. Irgendwelche Vorschläge wären großartig, da ich neu bei Scala und Slick bin. Ich bin mit Slick-Version 3.11

Die Fehlermeldung aus diesem Teil richtig

 result match { 

      case Failure(e: PSQLException) => { 
      //code: if Error I would like to return message below 
      Ok(s"PostgresIntegrityConstraintViolationException, code: ${e.getErrorCode}, sql status: ${e.getSQLState}, message: ${e.getMessage}") 

      } 
     } 

Antwort

2

bedenkt, dass ich verstehe Ihre Frage kommt, können Sie verschachtelten Fall verwenden. Überprüfen Sie im Fehlerfall den Fehlercode, wenn der Fehlercode wie erwartet angezeigt wird.

case Failure(e: PSQLException) => e.code match{ 
    case "23008" => println("Duplicate email") 
     case - => println("Some generic msg")  
      } 

Bitte lassen Sie mich wissen, wenn ich es falsch verstanden habe.

+0

Vielen Dank, dass funktioniert – user1591668

1

Die Fehlermeldungen

constructor cannot be instantiated to expected type; 
    found : akka.actor.FSM.Failure 
    required: scala.util.Try[Int] 

scheint darauf hinzudeuten, dass Sie an den falschen Failure Typ beziehen. Es ist nicht der Subtyp von Try, sondern der von Akka.

Vielleicht überprüfen Sie Ihre Importe?

+0

Ich musste nur einen verschachtelten Fall tun, und es hat funktioniert – user1591668

Verwandte Themen