![](/img/trans.png)
[英]The previous persisted data always being overlapped after the new persisting
[英]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.