在JAX-WS请求之间使用变量

时间:2017-05-31 16:59:46

标签: java web-services jax-ws

我正在尝试使用JAX -WS进行Web应用程序。我的问题似乎很简单,但我无法理解如何解决它。我有类变量,我需要在GET和POST请求中使用这些值。例如,我在GET方法中启动'响应',然后我需要在POST方法中使用它,但是当我从js调用POST api / conversation时,我收到错误,因为'response'仍为null。如何为变量保存价值?这是我的代码

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

}

1 个答案:

答案 0 :(得分:0)

有问题的Java类似乎不是容器托管bean。当您对GET和随后的POST方法进行休息服务调用时,会创建两个单独的Conversation类实例。因此,在第二次POST调用中,类字段响应将为null。

有多种方法可以解决这个问题。但是,采取的方法取决于回答问题:服务是否真的应该知道两个单独的客户请求?或者客户端应该进行一次GET调用,然后为后续的POST提供所需的信息。

我会使用下面提到的方法1,除非有充分的理由使用2,3或4.(2,3和4类似,只是它们是不同的规范/框架)

  1. 客户端缓存GET的响应,并使用POST请求发回所需信息
  2. 使用EE有状态会话bean(http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html
  3. 使用CDI会话范围的bean(http://docs.oracle.com/javaee/6/tutorial/doc/gjbbk.html
  4. 使用spring session scoped bean(http://springinpractice.com/2008/05/08/session-scoped-beans-in-spring / https://tuhrig.de/making-a-spring-bean-session-scoped/