我对 Spring 比较陌生,所以有一点对我来说不是很明显。即,控制器是单例的事实。我同意这是一个很好的方法,但这并不能让我实现我曾经用其他框架实现的东西。
我构建了一个使用 AJAX 请求的 Web 应用程序。我有BaseController
作为父级的控制器层次结构,所有其他控制器都对其进行了扩展。
应该向客户端返回响应的控制器操作使用注释进行@ResponseBody
注释,并将序列化的 JSON 字符串返回给客户端。
createJSONResponse()
执行此序列化的方法在 中实现,BaseController
这里的主要思想是每个子控制器的操作都Map<String, Object> responseMap
使用客户端数据所需的映射填充一个映射,然后在 中访问该映射BaseController
并对其进行序列化。
我不想responseMap
在每个动作中创建新实例,也不想每次都将它作为createJSONResponse()
.
responseMap
我通过在其他框架中声明BaseController
为protected
属性来实现这一点。
我不能用 Spring 做到这一点,因为所有控制器都是单例的,而且我不会有responseMap
每个请求的新实例。
我不确定将BaseController
请求范围设为一个好主意。
我创建了一个助手类作为请求范围的 bean,并在这个助手中声明了 responseMap。然后我将这个 bean 注入@Autowired
到BaseController
. 我还移出了createJSONResponse()
这个助手中的方法。然后从控制器中,我将此地图填充为helper.responseMap.add(<somedata>)
并调用helper.createResponseMap()
.
在这种情况下responseMap
变为空createResponseMap()
,它不包含在控制器操作中填充的数据。不知何故,它responseMAp
不是线程安全的,并且随着每个异步请求从一个线程移动到另一个线程。
有什么方法可以实现我需要的功能吗?
通过变通方法 解决:通过在每个请求之前实例化 responseMap 并添加到请求拦截器中的 HttpServletRequest 对象来解决问题。然后createJSONResponse() 方法和responseMap 填充方法参考getRequestMap() 方法从HttpServletRequest 中获取responseMap。
PS Still 很高兴知道更好的解决方案。