[英]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.