spring - 单例过滤器错误中的 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 来公开当前请求。
我该如何解决这个问题?如果这不是方式,我怎样才能实现我想要做的事情?
解决方案
推荐阅读
- angular - SELECT 在 Angular2/4 和 SAFARI 中无法正常工作
- android - 删除/删除特定缓存
- c# - 在选中该行的复选框时,绑定在“ OnCheckedChange”事件上的GridView内部的dropdownlist
- reactjs - 通过 Map 内的对象映射
- solr - Apachesolr 搜索结果排序
- cassandra - cassandra 如何通过添加节点来提高性能?
- asp.net-mvc-5 - SwaggerRequestExample 属性在 ASP.NET MVC 5 (.NET Framework 4.5.2) 中不起作用
- typescript - TypeScript:从等待的 Promise 中解构数组并在运行时编译并崩溃
- java - 在春季数据 jpa 中禁用自动更新
- python - 通过Python在sql中联合两个以上的表。