我对 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 很高兴知道更好的解决方案。