我正在将一个使用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)来实现这一点。另外,我还希望它能够以某种方式与现有的提供者一起工作,这将是非常好的。
1条答案
按热度按时间yqlxgs2m1#
你忘了
@Component
让spring把这个类看作一个bean。那你需要@Autowired
不是@Inject
要求HttpServletRequest
注射。根据文档,所有请求范围的springbean都可以请求HttpServletRequest
注射。至于提供者,你甚至不需要它来读取请求。您可以直接从httpservletrequest读取它