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