簡體   English   中英

使用HttpRequest初始化Spring Session Bean(使用批注)

[英]Initializing a Spring Session Bean using an HttpRequest (using annotations)

我正在嘗試構建(或擴充)使用Spring Bean(已通過注釋初始化)的Web應用程序。 我有一個需要初始化的bean,但是該bean需要一個HttpServletRequest來正確初始化(這是一個用戶標識bean)。

我瀏覽了文檔,看到了所需的內容,但這些內容似乎並未組合成一個完整的解決方案。

偽示例:

@Configuration
public class MyConfig {
    @Bean
    public UserBean userBean() {
        // initialize with HttpRequest somehow?
    }
}

@Controller
public class MyController {
    @Resource
    UserBean userBean;

    @RequestMapping(value="/userId", method=RequestMethod.GET)
    public String getUserInfo() {
        // do stuff with the initialized user bean here
    }
}

請注意,有多個控制器類,因此我不確定可能首先遇到哪個類。

我看到可以完成兩個可能的事情:

  1. MyConfig類中以惰性方式初始化Bean。 但是我不確定如何訪問HttpServletRequest對象。
  2. 通過getUserInfo()方法將bean注入會話中。 但是,該類中的每個方法可能都需要相同的初始化邏輯,而且我不確定如何將已初始化的UserBean注入會話中,以便其他控制器可以訪問相同的UserBean。

任何幫助/建議/等。 將不勝感激

看起來您缺少的是“ 春季范圍豆 ”功能。

基本上,作用域Bean是指在春季之前進行管理(創建/銷毀)的Bean,因此您不必為此擔心。 您也不必擔心初始化。 Spring為您處理。

請嘗試一下。 Scope定義添加到您的UserBean並將HttpServletRequest注入您的UserBean

@Bean
@Scope("request")
public UserBean userBean() {
    return new UserBean();
}

@Component
public class UserBean {

  @Inject
  HttpServletRequest request;

  @PostConstruct
  public void init(){
    // Access request object to initialize your object
  }
}

編輯

如果您無法修改UserBean,則可以在Java配置中獲取請求並初始化Bean。 例如:

HttpServletRequest請求=(((ServletRequestAttributes)RequestContextHolder

@Bean
@Scope("request")
public UserBean userBean() {
   HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
   return new UserBean(request);
}

如果我理解正確,則您正在嘗試創建某種服務器端會話存儲。

在這種情況下,最好的選擇是使用Servlet環境隨附的會話處理。 根據Spring的文檔,@ @RequestMapping注釋的方法可以使用javax.servlet.http.HttpServletRequest類型的參數。

在此對象上,可以使用getSession()方法獲取用戶的會話,或者如果不存在則生成一個新的會話。 您的UserBean -class將不再是bean,而只是普通對象。 您可以使用setAttribute(String, Object)將其存儲在會話中setAttribute(String, Object)並使用getAttribute(String)方法讀取它。

然后,無論您位於哪個控制器中,此會話對象都應包含相同的UserBean對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM