【问题标题】:string being in previous state even after triggering a new request java即使在触发新请求java之后字符串仍处于先前状态
【发布时间】:2021-09-26 15:12:28
【问题描述】:

我正在开发一个 spring boot api,我在其中使用了一个查询字符串,并在每个 get 请求上对其进行了一些替换操作,但即使在我触发了一个新请求之后,该字符串仍处于与之前 @987654321 相同的状态@ 调用,查询就搞砸了。

这是我的代码:

 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 请求时,都会根据映射值对GET_SETS 字符串进行一些更改,并且在下一个请求中再次进行相同的更改。

如何解决这个问题?我希望查询字符串是在每个请求开始时定义的内容。谢谢

【问题讨论】:

    标签: java string spring-boot get


    【解决方案1】:

    您的问题很可能是由在创建 Spring 组件时使用默认范围(即单例)引起的。

    Spring 为创建 bean 提供了以下范围 (source):

    • singleton(默认):将单个 bean 定义限定为每个 Spring IoC 容器的单个对象实例
    • prototype:将单个 bean 定义限定为任意数量的对象实例。
    • request:将单个 bean 定义限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有自己的实例 在单个 bean 定义的后面创建的 bean。仅有效 在 Web 感知 Spring ApplicationContext 的上下文中。
    • session:将单个 bean 定义限定为 HTTP 会话的生命周期。仅在 Web 感知 Spring 的上下文中有效 应用程序上下文。
    • 应用程序:将单个 bean 定义限定为 ServletContext 的生命周期。仅在 Web 感知 Spring 的上下文中有效 应用程序上下文。
    • websocket:将单个 bean 定义限定为 WebSocket 的生命周期。仅在 Web 感知 Spring 的上下文中有效 应用程序上下文。

    如果我们没有明确指定任何范围,则使用默认的单例范围。这意味着服务/组件在多个注入之间共享,因此它被多个GET 请求重用。

    为了摆脱这种行为,我们可能会使用请求范围之类的东西,尽管在这种情况下我们还必须注意线程安全。

    其他的解决办法是不使用成员变量,尝试使用局部变量来做GET_SETS之类的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 2022-12-23
      • 1970-01-01
      相关资源
      最近更新 更多