2017-05-31 1 views
0

J'essaye de faire une application web en utilisant JAX -WS. Mon problème semble être très simple, mais je ne peux pas comprendre comment le résoudre. J'ai des variables de classe dont les valeurs doivent être utilisées dans les requêtes GET et POST. Par exemple, j'initie 'response' dans la méthode GET et je dois l'utiliser ensuite dans la méthode POST, mais quand j'appelle POST api/conversation de js, je reçois une erreur parce que 'response' est toujours nul. Comment puis-je enregistrer la valeur pour les variables? Voici mon codeUtiliser une variable entre les requêtes JAX-WS

import javax.ws.rs.*; 

@ApplicationPath("api") 
@Path("conversation") 
public class Conversation { 
    private final String conversationWorkspace = "myworkspace"; 
    private final static String CONVERSATION_ID = "myid"; 
    private final static String CONVERSATION_PASS = "mypass"; 

private MessageRequest request; 
private MessageResponse response; 

private ConversationService service; 

@GET 
@Produces("application/text") 
public String getInitiatePhrase(){ 
    service = new ConversationService("2017-05-26", CONVERSATION_ID, CONVERSATION_PASS); 
    response = service.message(conversationWorkspace, null).execute(); //here response gets its value 

    return response.getText().get(0); 
} 

@POST 
@Produces("application/text") 
@Consumes("application/text") 
public String getBotAnswer(String userText){ 
    System.out.println("response " + response); 
    request = new MessageRequest.Builder().inputText(userText).context(response.getContext()).build(); //response must not be null 
    response = service.message(conversationWorkspace, request).execute(); 

    return response.getText().get(0); 
} 

}

Répondre

0

La classe Java en question ne semble pas être un conteneur bean géré. Lorsque vous apportez un appel de service de repos au GET et par la suite aux méthodes POST, deux instances distinctes de la classe Conversation sont créées. Par conséquent, la réponse de champ de classe sera null dans le deuxième appel POST.

Il existe plusieurs façons de résoudre ce problème. Cependant, l'approche à adopter dépend de la réponse à la question suivante: le service doit-il être au courant de deux demandes de clients distinctes? Ou le client doit-il faire un appel GET et fournir ensuite au POST suivant les informations requises.

J'utiliser l'approche 1 note ci-dessous, à moins qu'il y ait une bonne raison d'utiliser soit 2, 3 ou 4. (2, 3 et 4 sont similaires juste qu'ils sont différentes spécifications/cadres)

  1. Le client met en cache la réponse de l'EEG et envoie les informations nécessaires avant avec la demande POST
  2. utiliser une EE bean session avec état (http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html)
  3. utilisation d'une session de CDI scope haricot (http://docs.oracle.com/javaee/6/tutorial/doc/gjbbk.html)
  4. utilisation session de printemps scope haricot (http://springinpractice.com/2008/05/08/session-scoped-beans-in-spring/https://tuhrig.de/making-a-spring-bean-session-scoped/)
+0

J'ai utilisé 1 approche, cela a fonctionné. Je vous remercie! – Tanya