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

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

  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为自定义异常的父类,自定义的异常都要继承该类

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

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

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

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

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

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

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

  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. response.getWriter().write(jsonObject.toString());
  15. return null;
  16. }

最新文章

  1. OA(权限管理初步模块)
  2. nodejs回调函数
  3. CentOS7 Nexus安装
  4. SpringMVC从Controller跳转到另一个Controller
  5. 有了Hadoop MapReduce, 为什么还要Spark?
  6. EntityFramework-DBFirst-重新生成后写的验证消失(解决办法)
  7. FLAG_ACTIVITY_NEW_TASK和SingleInstance的设计思路(多task的应用)
  8. SPOJ 8222 Substrings(后缀自动机)
  9. MVC中的Repository模式
  10. android 垂直 SeekBar 源代码(VerticalSeekBar)[转]
  11. Codeforces Round #384 (Div. 2).C
  12. C++ STL Binary search详解
  13. Luogu_1944 最长括号匹配
  14. azkaban执行错误 Job failed, Cannot request memory (Xms 0 kb, Xmx 0 kb) from system for job
  15. update-alternatives符号连接的层数过多
  16. 解决读取Excel表格中某列数据为空的问题 c#
  17. FZU 2092 收集水晶(记忆化搜索)
  18. English trip -- VC(情景课)10 D Reading 阅读练习
  19. bzoj1084: [SCOI2005]最大子矩阵 dp
  20. linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结(转载)

热门文章

  1. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 3
  2. python的递归算法学习(1)
  3. postgres 基本使用
  4. HDU 6034 Balala Power!【排序/进制思维】
  5. bzoj2440(莫比乌斯函数)
  6. 线性基【p4570】 [BJWC2011]元素
  7. Python爬取中国天气网
  8. 三. Java类与对象9. 源文件的声明规则
  9. MySQL类型转换 使用CAST将varchar转换成int类型排序
  10. 彻底解决INSTALL_FAILED_UPDATE_INCOMPATIBLE的安装错误、安装包与之前设备上的安装包签名不一致