spring mvc controller中的异常封装
2016-04-16 15:24
453 查看
一直以来都在用spring mvc做mvc框架,我使用的不是基于注解的,还是使用的基于xml的,在controller里一般都会加上一个异常捕捉,能分析出来的异常,提示出具体信息,不能预料的异常,返回一个统一的异常提示信息,未封装前的代码为:
Java代码
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代码
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代码
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代码
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代码
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代码
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代码
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代码
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;
}
这是我的一些想法和做法,欢迎大家指正!
相关文章推荐
- maven 项目出现 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderServlet
- 已知二叉树的前序和中序序列,构建二叉树并求后序序列,java实现。
- Java 详解instanceof
- 字符串数组元素排列与组合的Java递归实现
- Spring中父子容器的实现实例
- Java技术_Java千百问(0030)_package和import作用是什么
- Java中的private、protected、public和default的区别
- DOM 事件
- spring+mybatis的注解事物 失效问题
- MyEclipse+egit+github
- Spring工作原理与单例
- 深入理解 Java中的 流 (Stream)
- java内置核心语言对象
- nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
- java的三大特性,封装,继承,多态
- Java:内省(Introspector)
- springMVC原理
- JVM8 元空间
- Spring事务配置常用的两种方法