簡體   English   中英

字符串在之前的 state 中,即使在觸發新請求后也是如此 java

[英]string being in previous state even after triggering a new request java

我正在處理一個 spring 啟動 api,我在其中使用了一個查詢字符串並在每個 get 請求上對其進行了一些替換操作,但即使在我觸發了一個新請求之后,該字符串與之前的GET調用和查詢的字符串在相同的 state 中搞砸了。

這是我的代碼:

 private static String GET_SETS = "Select * from table #check#";

現在我在同一個存儲庫中有 1 個方法,它在獲取請求時被調用:

public PagedList getSets(Map params) {
    if (!StringCheck.isEmpty(flattenMap.get("entity_name"))) {
        GET_SETS = GET_CODE_SETS.replace("#check#", " WHERE e.#entity_name# = ?");
        values.add((String)flattenMap.get("entity_name"));
    } else {
        GET_SETS = GET_SETS.replace("#check# #status_check#", "");
    }
}

現在每當觸發GET請求時,都會根據 map 值對GET_SETS字符串進行一些更改,並且在下一個請求中再次進行相同的更改。

如何解決這個問題? 我希望查詢字符串是在每個請求開始時定義的內容。 謝謝

您的問題很可能是由於在創建 Spring 組件時使用默認的 scope 引起的,即 singleton。

Spring 提供了以下用於創建 bean 的范圍( 來源):

  • singleton(默認):將單個 bean 定義的范圍限定為每個 Spring IoC 容器的單個 object 實例
  • 原型:將單個 bean 定義的范圍限定為任意數量的 object 個實例。
  • request:將單個 bean 定義的范圍限定為單個 HTTP 請求的生命周期。 也就是說,每個 HTTP 請求都有自己的 bean 實例,該實例是在單個 bean 定義的基礎上創建的。 僅在 web-aware Spring ApplicationContext 的上下文中有效。
  • session:將單個 bean 定義的范圍限定為 HTTP Session 的生命周期。僅在 web-aware Spring ApplicationContext 的上下文中有效。
  • application:將單個 bean 定義的范圍限定為 ServletContext 的生命周期。 僅在 web-aware Spring ApplicationContext 的上下文中有效。
  • websocket:將單個 bean 定義的范圍限定為 WebSocket 的生命周期。僅在 web-aware Spring ApplicationContext 的上下文中有效。

如果我們沒有明確指定任何 scope,則使用默認值 singleton scope。 這意味着服務/組件在多個注入之間共享,因此它被多個GET請求重用。

為了擺脫這種行為,我們可能會使用請求 scope 之類的東西,盡管在這種情況下我們也必須注意線程安全。

其他解決方案是不使用成員變量並嘗試對諸如GET_SETS類的東西使用局部變量。

暫無
暫無

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

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