繁体   English   中英

Spring 定义一个请求范围的 bean,它可以访问请求 object

[英]Spring define a request scoped bean that has access to the request object

我正在将一个 Java 应用程序迁移到 Spring(作为 web 框架和 DI)使用 guice 和 guice-servlet 库的 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 object。

基本上这个想法是有一个请求范围的 bean,它从请求的 header 获取信息。 我看到在 Spring 中有一个与 Guice 中类似的注释用于请求范围。

我不明白的是:如何创建一个可以访问当前请求标头的 bean(即使它是 Spring 对象)? 限制:我希望能够使用 Java 注释(不使用 XML)来做到这一点 奖励:我可以以某种方式与现有的提供者一起使用它会很棒。

您忘记@Component要求 Spring 将 class 视为 bean。 然后你需要@Autowired而不是@Inject来请求注入HttpServletRequest 根据文档,请求 scope 的所有 spring bean 都可以请求注入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));
   }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM