1

J'ai deux Actions dans différents contrôleurs ActionA et ActionB J'appelle ActionB dans ActionA et je veux obtenir sa réponse (ActionB) dans ActionA est-ce possible? Comment puis-je achive cette s'il vous plaît aider voici mon codecomment obtenir la réponse de Action appelée dans un cadre Action in play

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)) 
    } 
    } 
} 

s'il vous plaît aider

Répondre

1

Dans les contrôleurs de jeu 2.2 et 2.3 sont typiquement un object au lieu d'un class donc j'ai changé vos contrôleurs pour être des objets. Dans les nouvelles versions de contrôleurs de jeu, les classes sont injectées à l'aide du framework Guice. Comme les invocations d'actions sont asynchrones, vous devez remplacer ActionA par Action.async. Voici les changements que j'ai fait:

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)) 
    } 
    } 
} 

Comme la réponse précédente a fait allusion, il est beaucoup plus avantageux d'avoir un code de contrôleur partagé dans une couche de service qui se trouve en dessous de vos contrôleurs, par opposition au partage de code du contrôleur directement. Compte tenu de votre exemple simpliste, il semble OK de faire ce que vous faites.

+0

Merci beaucoup – swaheed

0

Si vous déployez vos contrôleurs en une seule machine virtuelle Java, je pense que vous pouvez extraire une fonction de ActionB et partager le code entre deux contrôleurs . Si vous déployez vos contrôleurs dans deux JVM différentes, vous devez dans ce cas utiliser une bibliothèque client de service Web pour interroger le point de terminaison. Juste mes deux cents.

+0

oui c'est dans une seule JVM mais comment obtenir la réponse d'ActionB dans ActionA s'il vous plaît le montrer via l'exemple de code – swaheed