You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Spring Boot GET请求触发后静态查询字符串状态未重置如何解决

问题根源
  • 你声明的GET_SETS是静态类变量,Spring默认所有Repository都是单例模式,所有请求共享同一个类实例,静态变量属于类全局共享资源,一旦被修改就会作用于后续所有请求,自然会残留上一次请求的修改状态。
解决方案

最小改动方案是将静态变量作为不可修改的原始模板,每次请求都基于模板生成当前请求专属的临时SQL字符串,不要修改原始模板的值。

  1. 修改静态模板定义,加final修饰强制不可修改,避免误赋值:
// 仅作为原始模板,全局不可修改
private static final String GET_SETS_TEMPLATE = "Select * from table #check#";
  1. 调整业务方法逻辑,所有SQL修改都作用于方法内的局部变量:
public PagedList getSets(Map params) {
    // 每次请求都从原始模板生成新的SQL,局部变量仅当前请求可见,不会干扰其他请求
    String currentGetSetsSql = GET_SETS_TEMPLATE;
    List<Object> values = new ArrayList<>();
    if (!StringCheck.isEmpty(flattenMap.get("entity_name"))) {
        currentGetSetsSql = currentGetSetsSql.replace("#check#", " WHERE e.#entity_name# = ?");
        values.add((String)flattenMap.get("entity_name"));
    } else {
        currentGetSetsSql = currentGetSetsSql.replace("#check# #status_check#", "");
    }
    // 后续使用currentGetSetsSql执行当前请求的查询逻辑
}
注意事项
  • 不要在单例Bean的类成员变量(包括静态、非静态)中存储请求级的可变状态,所有请求相关的可变变量都要定义在方法内部作为局部变量,由当前请求线程独立持有
  • 如果有多个动态占位符需要处理,也可以引入StringTemplate、MessageFormat等模板工具简化占位符替换逻辑,避免手动拼接SQL出错

内容的提问来源于stack exchange,提问作者rudeTool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:30:01