Java Spring Boot GET请求触发后静态查询字符串状态未重置如何解决
问题根源
- 你声明的
GET_SETS是静态类变量,Spring默认所有Repository都是单例模式,所有请求共享同一个类实例,静态变量属于类全局共享资源,一旦被修改就会作用于后续所有请求,自然会残留上一次请求的修改状态。
解决方案
最小改动方案是将静态变量作为不可修改的原始模板,每次请求都基于模板生成当前请求专属的临时SQL字符串,不要修改原始模板的值。
- 修改静态模板定义,加
final修饰强制不可修改,避免误赋值:
// 仅作为原始模板,全局不可修改 private static final String GET_SETS_TEMPLATE = "Select * from table #check#";
- 调整业务方法逻辑,所有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
相关产品推荐
相关产品推荐

