当前位置:首页 > 开发 > 开源软件 > 正文

spring mvc controller中的异常封装

发表于: 2014-03-17   作者:abc08010051   来源:转载   浏览:
摘要: 一直以来都在用spring mvc做mvc框架,我使用的不是基于注解的,还是使用的基于xml的,在controller里一般都会加上一个异常捕捉,能分析出来的异常,提示出具体信息,不能预料的异常,返回一个统一的异常提示信息,未封装前的代码为:   public ModelAndView addBigDeal(HttpServletRequest request, HttpSe

一直以来都在用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中的异常封装

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
SpringMVC Controller 介绍 一、简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServl
最近拿Spring MVC 3.x做项目,用了最新的系列相关Annotation来做Controller,有几点心得体会值得分享
最近拿Spring MVC 3.x做项目,用了最新的系列相关Annotation来做Controller,有几点心得体会值得分享
最近拿Spring MVC 3.x做项目,用了最新的系列相关Annotation来做Controller,有几点心得体会值得分
[@Controller]1 基于@注释的控制器配置 http://www.cnblogs.com/JavaTechLover/archive/2012/09/03/s
今天发现spring mvc把一个view参数匹配异常(org.springframework.web.bind.MissingServletRequestP
我们通过简易用户管理系统中的登录功能演示Spring MVC的异常处理,只是使用用户登录功能模拟Spring
出处:http://gaojiewyh.iteye.com/blog/1297746 SpringMVC 提供的异常处理主要有两种方式,一种是
装配与自定义拦截器 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦
spring mvc 异常统一处理 博客分类: spring3系列 SpringMVC 提供的异常处理主要有两种方式,一种是
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号