您的位置:首页 > 编程语言 > Java开发

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;

}

这是我的一些想法和做法,欢迎大家指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: