java - 即使在触发新请求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
,并且在下一个请求中再次进行相同的更改。
如何解决这个问题?我希望查询字符串是在每个请求开始时定义的内容。谢谢
解决方案
您的问题很可能是由在创建 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
.
推荐阅读
- html - 如何始终显示 Bootstrap 4 Jumbotron 中使用的背景图像的整个高度和宽度?
- drools - 升级 Kie Container 时,DROOLS Kie Scanner 是否保留有状态的 Kie Session 内容?
- flutter - 'If null' 运算符返回一个空字符串
- mysql - 使用动态创建的 JSON MySql 更新列值
- python - Django Query 字符串在会话期间停留在 url
- javascript - 如何使用 for 循环将一段重复的 javascript 打印到 HTML 文档?
- azure - 创建免费应用服务托管证书失败
- .net - Azure AD:Web api 调用另一个 Web api。授权类型错误
- mongodb - MongoDB 的 updateMany() 和重复 updateOne() 在性能方面有什么区别?
- android - Cordova (android) : 避免闪屏前的灰色背景