springMVC @ResponseBody HandlerInterceptor ModelAndView null
来源:互联网 发布:博客源码下载 编辑:程序博客网 时间:2024/05/22 05:03
今天springMVC开发遇到一个问题就是:
用了@RestController或者@ResponseBody注解之后,再用 拦截器拦截( HandlerInterceptor)的时候, 里面的 postHandle 的方法的参数ModelAndView 不管怎么弄都是null,很纠结,看了官网文档才知道加了这2个注解其实就不走视图转换而是走的这个类RequestResponseBodyMethodProcessor。
解决办法是加一个切面,然后在切面里面设置返回的参数到request(也可以设置到ThreadLocal)里面 然后拦截器里面在从request或者ThreadLocal里拿即可
切面类如下
@Aspect@Componentpublic class GateWayAOP { private ThreadLocal entityThreadLocal=new ThreadLocal(); //Controller层切点路径 @Pointcut("execution(* com.yihu.wlyy.web..*.*(..))") public void controllerAspect() { } public GateWayAOP() { //System.out.println("Observer---------------------------------------"); } @Around("controllerAspect()") public Object checkToken(ProceedingJoinPoint point) throws Throwable { Object obj = null; HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); try { obj = point.proceed(); }catch (Exception e){ e.printStackTrace(); } request.setAttribute("returnObj",obj);//先把结果放进 return obj; }}
拦截器里面拿
@Componentpublic class GateWayInterceptor implements HandlerInterceptor { private Logger logger = LoggerFactory.getLogger(GateWayInterceptor.class); @Autowired private GcHttpLogDao httpLogDao; @Autowired private GcTokenDao gcTokenDaoDao; /** * preHandle:预处理回调方法 * * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } /** * 后处理回调方法 * * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { String output = ""; if (modelAndView != null) { output = JSONObject.fromObject(modelAndView.getModelMap()).toString(); } else { Object returnObj = request.getAttribute("returnObj"); //再把结果放进 if (returnObj != null) { output = JSONObject.fromObject(returnObj).toString(); } } HandlerMethod handlerMethod = (HandlerMethod) handler;// response.getOutputStream() String token = request.getHeader("accesstoken"); String ip = NetworkUtil.getIpAddress(request); saveHttpLog(ip, JSONObject.fromObject(request.getParameterMap()).toString(), output, token, request.getRequestURI(), GcHttpLog.flagEm.success.getCode(), null); } /** * 整个请求处理完毕回调方法 * * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }}
这边要注意的是
因为每次请求都是新的request,所以是线程安全的
用ThreadLocal也是线程安全的
阅读全文
1 0
- springMVC @ResponseBody HandlerInterceptor ModelAndView null
- ModelAndView;@ResponseBody springMVC 返回类型
- HandlerInterceptor @Autowired报 null
- springMVC ModelAndView
- 【SpringMVC】ModelAndView
- springMvc ModelAndView
- springmvc modelandview
- SpringMVC之HandlerInterceptor
- springmvc 源码学习 handlerInterceptor
- SpringMVC源码解析-HandlerInterceptor
- SpringMVC @ResponseBody
- @ResponseBody-------springMVC
- springMVC ResponseBody
- SpringMVC @responsebody
- springMVC之拦截器-HandlerInterceptor
- springMVC的HandlerInterceptor拦截器
- springmvc源码阅读笔记 --HandlerInterceptor
- springMVC 拦截器 HandlerInterceptor 用法
- CodeForces
- 怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死?
- 数据结构-树和二叉树
- 【HPU】 1194 Judge【快速幂取模】【模板】
- Window.location.Reload()和window.location.href 区别
- springMVC @ResponseBody HandlerInterceptor ModelAndView null
- Spring整合hibernate框架
- oracle 建表类型以及约束
- 位运算--集合的整数表示
- 关于Matlab仿真 Emperor牌奴隶方获胜概率
- css中中文文字对齐和英文文字对齐的办法
- Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationT
- 数组
- 剑指Offe [10] 矩形覆盖