2017-08-18 48 views
1
  • 背景:
    Web项目使用SpringMvc框架需要前后 分离 - 重构。前端打算使用React,而后端的一些Controllers用于返回jsp视图需要返回jsonObject。传递到jspModelMap的数据现在需要转移到json并通过Response回写。为了避免修改每个Controller,我想出了使用Interceptor来完成这项工作的想法。它适用于那些Controllers通过数据与ModelMap,但它不适用于那些与RedirectAttributes通过数据。我怎样才能获得RedirectAttributes在HandlerInterceptor.postHandle()方法

  • 问题:
    有些控制器返回redirect和使用RedirectAttributes传递属性。由于postHandler()只有4个参数:request,response,handlermodelAndView,我很难从这些参数中获得RedirectAttributes的属性。

控制器代码:

@RequestMapping(value="save") 
public String save(CarInfoEntity entity, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes, Model model){ 
    redirectAttributes.addFlashAttribute("message", "success!"); 
    return "redirect:/demo/carInfo/list"; 
} 

拦截代码:

@Override 
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
    if(modelAndView != null) { 
     Map<String, Object> map = modelAndView.getModel(); 
     String json = JSON.toJSONString(map, SerializerFeature.DisableCircularReferenceDetect); 
     logger.debug(json); 
     if (null != json) { 
      try { 
       response.setHeader("Content-type", "application/json;charset=UTF-8"); 
       response.setCharacterEncoding("UTF-8"); 
       PrintWriter pw = response.getWriter(); 
       pw.write(json); 
       pw.flush(); 
       pw.close(); 
      } catch (IOException e) { 
      } 
     } 
     modelAndView.clear(); 
    } 
} 

问题1:我能否获得RedirectAttributes在拦截?
问题2:如果可以,怎么办?

回答

0

我试着用AOP,完美的解决了这个问题。我发现AOPIntercepter更强大。我可以更灵活地定义cut points,并获得getArgs()方法ProceedingJoinPoint的所有参数。