首页 > 解决方案 > 单例过滤器错误中的 Spring RequestScope 服务

问题描述

我有一个微服务,它接收用户信息作为请求标头。我想将用户信息保存在 RequestScoped bean 中,以确保为每个请求设置用户。因此我写了这个过滤器:

@Component
public class UserSetFilter implements Filter {

 private final UserService userService;

 public UserSetFilter(UserService userService) {
     this.userService = userService;
 }

 @Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
    final var user = ((HttpServletRequest) servletRequest).getHeader("user");
    userService.setUser(user);

    chain.doFilter(servletRequest, servletResponse);
 }
}

这是我的服务

@Service
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserService {
  private String user;

  public void setUser(String user) {
    this.user = user;
  }

  public String getUser() {
     return user;
  }
}

一旦我的服务被调用,就会出现异常:

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

我该如何解决这个问题?如果这不是方式,我怎样才能实现我想要做的事情?

标签: springspring-boot

解决方案


推荐阅读