簡體   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