首页 > 解决方案 > 即使在触发新请求java之后字符串仍处于先前状态

问题描述

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

这是我的代码:

 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,并且在下一个请求中再次进行相同的更改。

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

标签: javastringspring-bootget

解决方案


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

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

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

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

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

其他解决方案是不使用成员变量并尝试将局部变量用于诸如GET_SETS.


推荐阅读