spring mvc controller中的异常封装

一直以来都在用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. }  

 

这是我的一些想法和做法,欢迎大家指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值