1

ich habe zwei Aktionen in verschiedenen Controllern ActionA und ActionB Ich rufe ActionB in ActionA und ich möchte seine (ActionB) Antwort in ActionA ist es möglich? Wie kann ich diese achive bitte hier helfen, meinen Code istWie bekomme ich die Antwort der aufgerufenen Aktion innerhalb einer Aktion im Spiel-Framework

class ControllerA extends Controller{ 

def ActionA = Action { implicit request => 
    var jsonRequest = request.body.asJson.get 
    val uuid = (jsonRequest \ "uuid").as[String] 
    log.info("in ActionA" + uuid) 
    val controllerB= new ControllerB 
    val actionB=controllerB.ActionB.apply(request) 
    //here i want to get the response of ActionB and return this response as the response of ActionA whether its OK or InternelServerError 
    Ok("i want to show the response of ActionB") 
    } 
} 

class ControllerB extends Controller{ 
def ActionB = Action { implicit request => 
    var jsonRequest = request.body.asJson.get 
    val uuid = (jsonRequest \ "uuid").as[String] 
    log.info("in ActionB " + uuid) 
    try { 
     Ok("i am ActionB with id {}"+uuid) 
    } catch { 
     case e: Exception => 
     log.error("Exception ", e) 
     val status = Http.Status.INTERNAL_SERVER_ERROR 
     InternalServerError(Json.obj("status" -> status, "msg" -> ServerResponseMessages.INTERNAL_SERVER_ERROR)) 
    } 
    } 
} 

bitte

Antwort

1

Im Spiel 2.2 und 2.3 Controller sind in der Regel eine object anstelle einer class so änderte ich Ihre Controller zu Objekten. In neueren Versionen von Play-Controllern sind Klassen, die mit dem Guice-Framework injiziert werden.

Da der Aufruf von Aktionen asynchron ist, müssen Sie ActionA in Action.async ändern. Im Folgenden sind die Änderungen, die ich gemacht:

object ControllerA extends Controller{ 

    def ActionA = Action.async { implicit request => 
    var jsonRequest = request.body.asJson.get 
    val uuid = (jsonRequest \ "uuid").as[String] 
    log.info("in ActionA" + uuid) 
    ControllerB.ActionB(request) 
    } 
} 

object ControllerB extends Controller{ 
    def ActionB = Action { implicit request => 
    var jsonRequest = request.body.asJson.get 
    val uuid = (jsonRequest \ "uuid").as[String] 
    log.info("in ActionB " + uuid) 
    try { 
     Ok("i am ActionB with id {}"+uuid) 
    } catch { 
     case e: Exception => 
     log.error("Exception ", e) 
     val status = Http.Status.INTERNAL_SERVER_ERROR 
     InternalServerError(Json.obj("status" -> status, "msg" -> ServerResponseMessages.INTERNAL_SERVER_ERROR)) 
    } 
    } 
} 

Wie die vorherige Antwort auf angedeutet, es ist viel vorteilhafter in einer Dienstschicht gemeinsamen Controller-Code zu haben, die direkt zu teilen Controller-Code im Gegensatz unten Ihre Controller sitzen. Angesichts Ihres einfachen Beispiels, obwohl es in Ordnung zu tun scheint, was Sie tun.

+0

Vielen Dank – swaheed

0

helfen Wenn Sie Ihre Controller in einer einzigen JVM bereitstellen, ich denke, Sie eine Funktion aus actionb extrahieren und den Code zwischen zwei Controllern teilen . Wenn Sie Ihre Controller in zwei verschiedenen JVMs bereitstellen, müssen Sie in diesem Fall eine Webdienst-Clientbibliothek zum Abfragen des Endpunkts verwenden. Nur meine zwei Cent.

+0

ja es in einzelnen JVM aber wie man ActionB's Antwort in ActionA bekommt, bitte zeigen Sie es über Codebeispiel – swaheed

Verwandte Themen