spring定义一个请求范围的bean,该bean可以访问请求对象

qoefvg9y  于 2021-07-16  发布在  Java
关注(0)|答案(1)|浏览(387)

我正在将一个使用guice和guiceservlet库的java应用程序迁移到spring(作为web框架和di)。
我需要迁移以下带有guice的代码:

import com.google.inject.servlet.RequestScoped;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.servlet.http.HttpServletRequest;

@RequestScoped
public class CurrentUserProvider implements Provider<User> {

  private static final String CURRENT_USER_HEADER = "x-current-user";

  @Inject
  private Provider<HttpServletRequest> requestProvider;

  @Override
  public User get() {
    return new User(requestProvider.get().getHeader(CURRENT_USER_HEADER));
  }
}

在我的guice模块中,我有如下内容: bind(User.class).toProvider(CurrentUserProvider.class); 基本上能让我注射 User 对象与当前用户在我的应用程序中的任意位置。
基本上,这个想法是有一个请求范围的bean,它从请求的头中获取信息。我看到在spring中有一个类似于guice中的注解,用于请求范围。
我不明白的是:如何创建一个能够访问当前请求头的bean(即使它是spring对象)?局限性:我希望能够用java注解(而不是xml)来实现这一点。另外,我还希望它能够以某种方式与现有的提供者一起工作,这将是非常好的。

yqlxgs2m

yqlxgs2m1#

你忘了 @Component 让spring把这个类看作一个bean。那你需要 @Autowired 不是 @Inject 要求 HttpServletRequest 注射。根据文档,所有请求范围的springbean都可以请求 HttpServletRequest 注射。
至于提供者,你甚至不需要它来读取请求。您可以直接从httpservletrequest读取它

@Component
@RequestScoped
public class CurrentUserProvider implements Provider<User> {

  private static final String CURRENT_USER_HEADER = "x-current-user";

  @Autowired
  private HttpServletRequest httpServletRequest;

  @Override
  public User get() {
  return new User(httpServletRequest.getHeader(CURRENT_USER_HEADER));
   }

}

相关问题