spring mvc controller中的异常封装

http://abc08010051.iteye.com/blog/2031992

 

一直以来都在用spring mvc做mvc框架,我使用的不是基于注解的,还是使用的基于xml的,在controller里一般都会加上一个异常捕捉,能分析出来的异常,提示出具体信息,不能预料的异常,返回一个统一的异常提示信息,未封装前的代码为:

 

Java代码  收藏代码
  1. public ModelAndView addBigDeal(HttpServletRequest request, HttpServletResponse response) throws Exception {  
  2.     JSONObject jsonObject = new JSONObject();  
  3.     try {  
  4.         String sessionId = WebUtils.getStringValue(request, "sessionId", true);  
  5.         String pl_id = WebUtils.getStringValue(request, "pl_id", true);  
  6.         String vsr_id = WebUtils.getStringValue(request, "vsr_id", true);  
  7.         String cmnts = WebUtils.getStringValue(request, "cmnts", false);  
  8.         if (!StringUtils.isBlank(cmnts)) {  
  9.             cmnts = new String(Base64Utils.decode(cmnts), "UTF-8");  
  10.         }  
  11.         JSONObject result = new JSONObject();  
  12.         result.put("dataId", this.storeVsrService.addBigDeal(pl_id, vsr_id, cmnts));  
  13.         jsonObject.put("data", result);  
  14.         jsonObject.put("status", CommonUtils.getSubStatus(" add bigDeal  successfully!"));  
  15.     } catch (GenericException e) {  
  16.         jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", e.getMsg()));  
  17.         jsonObject.put("data", "");  
  18.         logger.error("error !", e);  
  19.     } catch (Exception e) {  
  20.         jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", "网络或其他错误,请联系管理员!"));  
  21.         jsonObject.put("data", "");  
  22.         logger.error("error !", e);  
  23.     }  
  24.     response.getWriter().write(jsonObject.toString());  
  25.     return null;  
  26. }  

 GenericException为自定义异常的父类,自定义的异常都要继承该类

 

上面代码的缺点:每写一个方法时,都要重复的写这一段:

Java代码  收藏代码
  1. try {  
  2.   
  3.         } catch (GenericException e) {  
  4.             jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", e.getMsg()));  
  5.             jsonObject.put("data", "");  
  6.             logger.error("error !", e);  
  7.         } catch (Exception e) {  
  8.             jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", "网络或其他错误,请联系管理员!"));  
  9.             jsonObject.put("data", "");  
  10.             logger.error("error !", e);  
  11.         }  

 

因为每一个controller都会继承MultiActionController,现在在每一个controller和自己定义的controller里抽象一层,因为所有controller里的方法入口

都是MultiActionController里的handleRequestInternal方法,所以重写该方法,把异常捕捉放到这个统一的入口和出口里,

新增加的类为BaseController,封装后的代码如下:

Java代码  收藏代码
  1. package com.intel.store.controller;  
  2.   
  3. import com.intel.store.common.CommonUtils;  
  4. import com.intel.store.exception.GenericException;  
  5. import org.codehaus.jettison.json.JSONObject;  
  6. import org.slf4j.Logger;  
  7. import org.slf4j.LoggerFactory;  
  8. import org.springframework.web.servlet.ModelAndView;  
  9. import org.springframework.web.servlet.mvc.multiaction.MultiActionController;  
  10. import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;  
  11.   
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14.   
  15. /** 
  16.  *  mvc controller类的基类,用于一般controller的继承, 
  17.  *  把异常控制模块提取到基类, 
  18.  *  使开发更加简洁,快速 
  19.  * Created with IntelliJ IDEA. 
  20.  * User: malone 
  21.  * Date: 14-3-17 
  22.  * Time: 上午10:21 
  23.  * To change this template use File | Settings | File Templates. 
  24.  */  
  25. public class BaseController<T extends BaseController<T>> extends MultiActionController {  
  26.   
  27.     private Class<T> subclass;  
  28.   
  29.     private Logger logger = LoggerFactory.getLogger(subclass);  
  30.   
  31.     BaseController() {  
  32.         subclass = ((Class)((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0]);  
  33.         logger = LoggerFactory.getLogger(subclass);  
  34.     }  
  35.   
  36.     @Override  
  37.     protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)  
  38.             throws Exception {  
  39.         JSONObject jsonObject = new JSONObject();  
  40.         try {  
  41.             String methodName = this.getMethodNameResolver().getHandlerMethodName(request);  
  42.             Object obj = invokeNamedMethod(methodName, request, response);  
  43.             System.out.println(obj.getClass());  
  44.             return invokeNamedMethod(methodName, request, response);  
  45.         } catch (NoSuchRequestHandlingMethodException ex) {  
  46.             return handleNoSuchRequestHandlingMethod(ex, request, response);  
  47.         } catch (GenericException e) {  
  48.             jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", e.getMsg()));  
  49.             jsonObject.put("data", "");  
  50.             logger.error(e.getMsg(), e);  
  51.             response.getWriter().write(jsonObject.toString());  
  52.             return null;  
  53.         } catch (Exception e) {  
  54.             jsonObject.put("status", CommonUtils.getSubStatus(false, "000001",  
  55.                     "网络或其他错误,请联系管理员!"));  
  56.             jsonObject.put("data", "");  
  57.             logger.error("error !", e);  
  58.             response.getWriter().write(jsonObject.toString());  
  59.             return null;  
  60.         }  
  61.     }  
  62.   
  63. }  

 

这样以来所有的自定义Controller只需要继承BaseController, 然后在每个方法里就需要些try catch异常捕捉模块了,如下所示

Java代码  收藏代码
  1. public ModelAndView addBigDeal(HttpServletRequest request, HttpServletResponse response) throws Exception {  
  2.     JSONObject jsonObject = new JSONObject();  
  3.         String sessionId = WebUtils.getStringValue(request, "sessionId", true);  
  4.         String pl_id = WebUtils.getStringValue(request, "pl_id", true);  
  5.         String vsr_id = WebUtils.getStringValue(request, "vsr_id", true);  
  6.         String cmnts = WebUtils.getStringValue(request, "cmnts", false);  
  7.         if (!StringUtils.isBlank(cmnts)) {  
  8.             cmnts = new String(Base64Utils.decode(cmnts), "UTF-8");  
  9.         }  
  10.         JSONObject result = new JSONObject();  
  11.         result.put("dataId", this.storeVsrService.addBigDeal(pl_id, vsr_id, cmnts));  
  12.         jsonObject.put("data", result);  
  13.         jsonObject.put("status", CommonUtils.getSubStatus(" add bigDeal  successfully!"));  
  14.      
  15.     response.getWriter().write(jsonObject.toString());  
  16.     return null;  
  17. }  

 

posted @ 2015-08-12 16:53  剑握在手  阅读(1543)  评论(0编辑  收藏  举报
返回顶部↑