2

Spring-api 3.+ 以后引入了对异步请求处理的支持,所以我想用我最喜欢的 Akka 提供的并发模型把它放到示例 web 应用程序中

我的代码看起来像这样

      @RequestMapping(value = Array("/"), method = Array(RequestMethod.GET))
      @ResponseBody
      def adminHome(request: HttpServletRequest) : DeferredResult[ModelAndView] = {
  
        import ExecutionContext.Implicits.global

        val result = new DeferredResult[ModelAndView]
           
       ........ code for some future .........

      // creating model map future from some future
       val modelMapFuture: Future[Map[String, Any]] = someFuture.flatMap(urlObjects =>
       Future(
        Map("urlList" -> urlObjects.asJava)
       ))


       // setting the deferred result value upon completion of future
        modelMapFuture.onComplete {
          case Success(modelMap) => result.setResult(new ModelAndView("index", modelMap.asJava))
         case Failure(e) => result.setResult(new ModelAndView("index"))
       }

    result
   }
  

我已经启用了对 Spring mvc DispatcherServelet 的 aync 支持以及附加到特定 serverlet 的 url 映射的所有过滤器。

但结果我总是得到一个空页面。

我可以通过以下方式帮助您缩小问题范围 -

一个。模型/视图中没有例外

如果我将视图设置为带有 h​​ello world 的简单 JSP,它也不会加载。

湾。请求映射工作正常

C。未来完成没有错误

d。延迟结果设置正确

我已将 DeferredResultProcessingInterceptorAdapter 实现绑定到 mvc:deferred-result-interceptors 并为 beforeConcurrentHandling、preProcess、postProcess 和 afterCompletion 放置日志我从拦截器获取以下日志

并发处理请求之前:延迟结果过期或设置为:false

预处理:延迟结果过期或设置为:假

后期处理:延迟结果过期或设置为:true

完成后:延迟结果过期或设置为:true

任何帮助都会受到高度评价,因为我整整两天都在为此苦苦挣扎。

更多细节

Spring 3.2.3 版-RELEASE Tomcat 7.0.42 版

4

1 回答 1

1

我认为您不应该@ResponseBodyModelAndView. @ResponseBody如果您只是简单地返回一些数据——比如DeferredResult[List[String]].

于 2013-09-25T17:05:02.997 回答