• 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. }  
  • 相关阅读:
    程序猿初出茅庐之一:学习方法
    Winform实现鼠标可穿透的窗体镂空效果
    HashMap源码分析(上)
    Java Integer常量池——IntegerCache内部类
    find the Nth highest salary(寻找第N高薪水)
    分布式理论:深入浅出Paxos算法
    smash:一个类unix内核
    【官网翻译】如何在VSCode中使用代码片段功能(snippets)?
    JavaScript与魔数检测
    给你一个团队,你能怎么管-读后感-凝聚力和执行力(1)
  • 原文地址:https://www.cnblogs.com/flying607/p/4724856.html
Copyright © 2020-2023  润新知