spring mvc controller中的异常封装
http://abc08010051.iteye.com/blog/2031992
一直以来都在用spring mvc做mvc框架,我使用的不是基于注解的,还是使用的基于xml的,在controller里一般都会加上一个异常捕捉,能分析出来的异常,提示出具体信息,不能预料的异常,返回一个统一的异常提示信息,未封装前的代码为:
- public ModelAndView addBigDeal(HttpServletRequest request, HttpServletResponse response) throws Exception {
- JSONObject jsonObject = new JSONObject();
- try {
- String sessionId = WebUtils.getStringValue(request, "sessionId", true);
- String pl_id = WebUtils.getStringValue(request, "pl_id", true);
- String vsr_id = WebUtils.getStringValue(request, "vsr_id", true);
- String cmnts = WebUtils.getStringValue(request, "cmnts", false);
- if (!StringUtils.isBlank(cmnts)) {
- cmnts = new String(Base64Utils.decode(cmnts), "UTF-8");
- }
- JSONObject result = new JSONObject();
- result.put("dataId", this.storeVsrService.addBigDeal(pl_id, vsr_id, cmnts));
- jsonObject.put("data", result);
- jsonObject.put("status", CommonUtils.getSubStatus(" add bigDeal successfully!"));
- } catch (GenericException e) {
- jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", e.getMsg()));
- jsonObject.put("data", "");
- logger.error("error !", e);
- } catch (Exception e) {
- jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", "网络或其他错误,请联系管理员!"));
- jsonObject.put("data", "");
- logger.error("error !", e);
- }
- response.getWriter().write(jsonObject.toString());
- return null;
- }
GenericException为自定义异常的父类,自定义的异常都要继承该类
上面代码的缺点:每写一个方法时,都要重复的写这一段:
- try {
- } catch (GenericException e) {
- jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", e.getMsg()));
- jsonObject.put("data", "");
- logger.error("error !", e);
- } catch (Exception e) {
- jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", "网络或其他错误,请联系管理员!"));
- jsonObject.put("data", "");
- logger.error("error !", e);
- }
因为每一个controller都会继承MultiActionController,现在在每一个controller和自己定义的controller里抽象一层,因为所有controller里的方法入口
都是MultiActionController里的handleRequestInternal方法,所以重写该方法,把异常捕捉放到这个统一的入口和出口里,
新增加的类为BaseController,封装后的代码如下:
- package com.intel.store.controller;
- import com.intel.store.common.CommonUtils;
- import com.intel.store.exception.GenericException;
- import org.codehaus.jettison.json.JSONObject;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.web.servlet.ModelAndView;
- import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
- import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- * mvc controller类的基类,用于一般controller的继承,
- * 把异常控制模块提取到基类,
- * 使开发更加简洁,快速
- * Created with IntelliJ IDEA.
- * User: malone
- * Date: 14-3-17
- * Time: 上午10:21
- * To change this template use File | Settings | File Templates.
- */
- public class BaseController<T extends BaseController<T>> extends MultiActionController {
- private Class<T> subclass;
- private Logger logger = LoggerFactory.getLogger(subclass);
- BaseController() {
- subclass = ((Class)((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0]);
- logger = LoggerFactory.getLogger(subclass);
- }
- @Override
- protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- JSONObject jsonObject = new JSONObject();
- try {
- String methodName = this.getMethodNameResolver().getHandlerMethodName(request);
- Object obj = invokeNamedMethod(methodName, request, response);
- System.out.println(obj.getClass());
- return invokeNamedMethod(methodName, request, response);
- } catch (NoSuchRequestHandlingMethodException ex) {
- return handleNoSuchRequestHandlingMethod(ex, request, response);
- } catch (GenericException e) {
- jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", e.getMsg()));
- jsonObject.put("data", "");
- logger.error(e.getMsg(), e);
- response.getWriter().write(jsonObject.toString());
- return null;
- } catch (Exception e) {
- jsonObject.put("status", CommonUtils.getSubStatus(false, "000001",
- "网络或其他错误,请联系管理员!"));
- jsonObject.put("data", "");
- logger.error("error !", e);
- response.getWriter().write(jsonObject.toString());
- return null;
- }
- }
- }
这样以来所有的自定义Controller只需要继承BaseController, 然后在每个方法里就需要些try catch异常捕捉模块了,如下所示
- public ModelAndView addBigDeal(HttpServletRequest request, HttpServletResponse response) throws Exception {
- JSONObject jsonObject = new JSONObject();
- String sessionId = WebUtils.getStringValue(request, "sessionId", true);
- String pl_id = WebUtils.getStringValue(request, "pl_id", true);
- String vsr_id = WebUtils.getStringValue(request, "vsr_id", true);
- String cmnts = WebUtils.getStringValue(request, "cmnts", false);
- if (!StringUtils.isBlank(cmnts)) {
- cmnts = new String(Base64Utils.decode(cmnts), "UTF-8");
- }
- JSONObject result = new JSONObject();
- result.put("dataId", this.storeVsrService.addBigDeal(pl_id, vsr_id, cmnts));
- jsonObject.put("data", result);
- jsonObject.put("status", CommonUtils.getSubStatus(" add bigDeal successfully!"));
- response.getWriter().write(jsonObject.toString());
- return null;
- }
spring mvc controller中的异常封装的更多相关文章
- spring mvc controller中获取request head内容
spring mvc controller中获取request head内容: @RequestMapping("/{mlid}/{ptn}/{name}") public Str ...
- Spring MVC Controller中解析GET方式的中文参数会乱码的问题(tomcat如何解码)
Spring MVC Controller中解析GET方式的中文参数会乱码的问题 问题描述 在工作上使用突然出现从get获取中文参数乱码(新装机器,tomcat重新下载和配置),查了半天终于找到解决办 ...
- Spring MVC Controller中GET方式传过来的中文参数会乱码的问题
Spring MVC controller 这样写法通常意味着访问该请求,GET和POST请求都行,可是经常会遇到,如果碰到参数是中文的,post请求可以,get请求过来就是乱码.如果强行对参数进行了 ...
- spring MVC controller中的方法跳转到另外controller中的某个method的方法
1. 需求背景 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示. 本来以为挺简单的一 ...
- spring mvc Controller中使用@Value无法获取属性值
在使用spring mvc时,实际上是两个spring容器: 1,dispatcher-servlet.xml 是一个,我们的controller就在这里,所以这个里面也需要注入属性文件 org.sp ...
- 在Spring MVC Controller中注入HttpServletRequest对象会不会造成线程安全的问题
做法: 1.比如我们在Controller的方法中,通常是直接将HttpServletRequest做为参数,而为了方便节省代码,通常会定义为全局变量,然后使用@Autowire注入. 说明: 1.观 ...
- spring mvc controller中的参数验证机制(二)
这里我们介绍以下自定义的校验器的简单的使用示例 一.包结构和主要文件 二.代码 1.自定义注解文件MyConstraint package com.knyel.validator; import ja ...
- spring mvc controller中的参数验证机制(一)
一.验证用到的注解 @Valid 对传到后台的参数的验证 @BindingResult 配合@Valid使用,验证失败后的返回 二.示例 1.传统方式 @PostMapping public User ...
- spring mvc controller间跳转 重定向 传参(转)
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
随机推荐
- strtol函數的用法 atof, atoi, atol, strtod, strtoul
相关函数: atof, atoi, atol, strtod, strtoul表头文件: #include <stdlib.h>定义函数: long int strtol(const ch ...
- jmeter压测脚本编写与静态文件处理
一.压测脚本编写 概述:工具为谷歌浏览器-->F12-->Network,访问被测站点,通过其中的请求的地方来构造压测脚本 二.静态文件处理 概述:静态文件包括css/js/图片等,它们有 ...
- ws2s函数
std::string ws2s(const std::wstring& str) { char* pElementText; int iTextLen; // wide char to mu ...
- Selenium2+python自动化3-解决pip使用异常【转载】
一.pip出现异常 有一小部分童鞋在打开cmd输入pip后出现下面情况:Did not provide a commandDid not provide a command?这是什么鬼?正常情况应该是 ...
- js继承的实现
js继承有5种实现方式: 1.继承第一种方式:对象冒充 function Parent(username){ this.username = username; this.hell ...
- [转载]python实现带验证码网站的自动登陆
原文地址:python实现带验证码网站的自动登陆作者:TERRY-V 早听说用python做网络爬虫非常方便,正好这几天单位也有这样的需求,需要登陆XX网站下载部分文档,于是自己亲身试验了一番 ...
- AtCoder Grand Contest 012 B Splatter Painting (反向处理 + 记忆化)
题目链接 agc012 Problem B 题意 给定一个$n$个点$m$条边的无向图,现在有$q$个操作.对距离$v$不超过$d$的所有点染色,颜色编号为$c$. 求每个点最后的颜色状态. 倒过 ...
- 线性基【p4570】 [BJWC2011]元素
题目描述-->p4570 [BJWC2011]元素 题目大意 给定一些矿石的编号与价值,我们想要得到最大的价值和,并且选定物品的编号异或之和不为0. 分析 线性基就不多bb了,来这里->p ...
- luogu P3817 小A的糖果
题目描述 小A有N个糖果盒,第i个盒中有a[i]颗糖果. 小A每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中加起来都只有x颗或以下的糖果,至少得吃掉几颗糖. 输入输出格式 输入格 ...
- 3.1常用类(java学习笔记)包装类及日期类
一.包装类 java是一门面向对象的语言,秉承一切皆对象的思想. 可java中有一些基本数据类型并不是对象,有时可能需要将它们变为对象. 这时就需要用到我们的包装类了. 基本数据类型 包装类 int ...