正在获取 java.lang.IllegalStateException:使用 Kafka Consumer 命中时未发现线程绑定请求 API

Getting java.lang.IllegalStateException: No thread-bound request found when using Kafka Consumer to hit API

我的要求是从 API 请求中获取 cookie,然后将相同的 cookie 传递给后续请求,以便使用相同的 JsessionID 维护会话。

为此,我正在尝试通过自动装配 HttpServletRequests 使用 HttpHeaders 获取 cookie。 如果我使用控制器点击 API 我没有得到任何异常并且我能够获取所有请求属性但是如果我 运行 Kafka 和 API 运行s 通过Kafka 消费者,我遇到以下异常:

java.lang.IllegalStateException:未找到线程绑定请求:您指的是实际 Web 请求之外的请求属性,还是在原始接收线程之外处理请求?如果您实际上是在 Web 请求中操作并且仍然收到此消息,则您的代码可能 运行 在 DispatcherServlet 之外:在这种情况下,请使用 RequestContextListener 或 RequestContextFilter 来公开当前请求。

  @Autowired
  HttpServletRequest req;
  
  @Autowired
  HttpServletResponse res;
 
 public ResponseBean putData() {

    String jsessionId = null;
    String id = null;

    // Creating Headers for request
    String authValue = req.getHeader("authorization");
    String headerCookie = req.getHeader("Cookie");


    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.set("authorization", authValue);
    httpHeaders.setContentType(MediaType.APPLICATION_JSON);
    httpHeaders.set(HttpHeaders.COOKIE, headerCookie);


    HttpEntity httpEntity = new HttpEntity(httpHeaders);

    ResponseEntity<String> responseEntity = restTemplate.exchange
            ("https://url", HttpMethod.POST, httpEntity, String.class);
    jsessionId = responseEntity.getHeaders().getFirst("Set-Cookie");


    if (jsessionId !=null && jsessionId.contains("JSESSION")) {
        logger.info("New login session created");
        id = jsessionId.substring(jsessionId.indexOf('=') + 1, jsessionId.indexOf(';'));
       
        Cookie cookie = new Cookie("JSESSIONID", id);
        res.addCookie(cookie);
    }

}

PS- 我没有使用 SpringSecurity。

谁能帮我解决上述问题。

java.lang.IllegalStateException: No thread-bound request found:

此异常试图告诉您 HttpServletRequest 当前没有正在处理的请求,该请求已 auto-wired 进入您的 class。

有些东西正在调用 putData() 方法,但不是通过调用 HTTP 控制器。您提到您正在使用“Kafka Consumer”,所以可能是调用 putData() 的消费者代码?您不能调用它,因为该方法需要有网络请求上下文才能工作,因为它需要请求 headers 和 cookie 信息。

您可能应该将数据持久化代码分离出来,以便控制器 putData() 方法和 kafka 消费者都可以调用它。