spring mvc controller中的异常封装
2015-08-12 16:53
666 查看
http://abc08010051.iteye.com/blog/2031992
一直以来都在用spring mvc做mvc框架,我使用的不是基于注解的,还是使用的基于xml的,在controller里一般都会加上一个异常捕捉,能分析出来的异常,提示出具体信息,不能预料的异常,返回一个统一的异常提示信息,未封装前的代码为:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/14/25ae00593f41100b5b1a6ad2c1a6eb00.png)
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为自定义异常的父类,自定义的异常都要继承该类
上面代码的缺点:每写一个方法时,都要重复的写这一段:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/14/25ae00593f41100b5b1a6ad2c1a6eb00.png)
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,封装后的代码如下:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/14/25ae00593f41100b5b1a6ad2c1a6eb00.png)
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异常捕捉模块了,如下所示
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/14/25ae00593f41100b5b1a6ad2c1a6eb00.png)
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做mvc框架,我使用的不是基于注解的,还是使用的基于xml的,在controller里一般都会加上一个异常捕捉,能分析出来的异常,提示出具体信息,不能预料的异常,返回一个统一的异常提示信息,未封装前的代码为:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/14/25ae00593f41100b5b1a6ad2c1a6eb00.png)
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为自定义异常的父类,自定义的异常都要继承该类
上面代码的缺点:每写一个方法时,都要重复的写这一段:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/14/25ae00593f41100b5b1a6ad2c1a6eb00.png)
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,封装后的代码如下:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/14/25ae00593f41100b5b1a6ad2c1a6eb00.png)
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异常捕捉模块了,如下所示
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/14/25ae00593f41100b5b1a6ad2c1a6eb00.png)
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;
}
相关文章推荐
- Java中string 创建对象时 “”和null的区别
- java void 和 Void 大写的 V 和 小写的v
- java如何赋值对象
- 非常好的Java反射例子
- 智渔课堂官方免费教程三十五:Java集合框架之Collection接口和Collections类
- Eclipse 快捷键汇总,基本都包括了
- ant 封装 时出现java.lang.OutOfMemoryError: Java heap space
- I学霸官方免费教程三十五:Java集合框架之Collection接口和Collections类
- Spring MVC 处理请求流程
- spring-struts-mybatis整合错误集锦
- JAVA深入研究——Method的Invoke方法。
- FtpClient上传文件异常:java.net.SocketException: Connection reset
- MyEclipse工具disable maven nature后 恢复maven依赖
- for多层循坏跳到外层循环
- 排序算法系列——直接插入排序
- 智渔课堂官方免费教程三十四:Java集合框架之泛型集合
- I学霸官方免费教程三十四:Java集合框架之泛型集合
- 递归····
- 栈和队列的java实现
- javax.mail 调用企业邮箱发送邮件,调用个人邮箱发送邮件