`

spring mvc controller中的异常封装

阅读更多

一直以来都在用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 简单登陆例子

    一个简单的基于Spring MVC的简单登陆的例子,在这个例子中,把表单提交的用户名和密码封装到实体类中传递到controller中,项目代码使用注解模式。表单中的用户名和密码完全相同才能登陆成功。

    Spring MVC笔记.md

    将应用程序分为 Controller、Model、View 三层,Controller 接收客户端请求,调用 ...Spring MVC 就是对这套流程的封装,屏蔽了很多底层代码,开放出接口,让开发者可以更加轻松、便捷地完成基于 MVC 模式的 Web 开发。

    Spring + Spring MVC + SpringData JPA + mysql +jsp实现一个简易的个人博客系统

    • 服务层,封装复杂业务逻辑 • UserService类、StatusService类 • 控制层,Controller,URL路径映射 • UserController类、FriendshipController类、StatusController类、 CommentController类、...

    针对SpringBoot项目中的参数传递使用 RSA加密机制保证安全性进行封装成工具(高分项目).zip

    Java SSM项目是一种使用Java语言和SSM框架(Spring + Spring MVC + MyBatis)开发的Web应用程序。SSM是一种常用的Java开发框架组合,它结合了Spring框架、Spring MVC框架和MyBatis框架的优点,能够快速构建可靠、...

    基于Springboot+Mybatis+ SpringMvc+springsecrity+Redis完整网站后台管理系统

    代码生成:根据表名生成bean、controller、dao、Mapper.xml、列表页、搜索、分页、新增页、修改页 job集群:创建job、取消job、查询job、下拉搜索spring bean 数据源监控:druid 接口swagger文档 日志查询 邮件...

    Spring-MVC前后端表单注册Demo

    对spring的dao(@Repository)、service、conponent、controller、model层进行了分别的示例、环境配置完全OK,jdk建议使用1.8。前端是jsp进行的表单传输数据。数据库目前没有使用spring的jdbc封装类。

    开源框架 Spring Gossip

    第一个 Spring MVC 程式 WebApplicationContext Handler Mapping Handler Interceptor Controller 继承架构 ModelAndView View Resolver Exception Resolver 使用 Controller ...

    基于SSM框架实现电子商城系统带sql数据库文件分享

    SSM框架是spring、spring MVC 、和mybatis框架的整合,是标准的MVC模式。标准的SSM框架有四层,分别是dao层(mapper),service层,controller层和View层。使用spring实现业务对象管理,使用spring MVC负责请求的...

    基于SSM框架实现电子商城系统带sql数据库文件

    SSM框架是spring、spring MVC 、和mybatis框架的整合,是标准的MVC模式。标准的SSM框架有四层,分别是dao层(mapper),service层,controller层和View层。使用spring实现业务对象管理,使用spring MVC负责请求的...

    Spring面试题

    ☆ Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。 Spring 框架的...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    10.5 Spring的控制器(Controller) 10.5.1 Controller接口 10.5.2 命令控制器(BaseCommandController) 10.5.3 表单控制器(SimpleFormController) 10.5.4 多动作控制器(MultiActionController) 10.6 Spring的...

    springmybatis

    mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    10.5 Spring的控制器(Controller) 10.5.1 Controller接口 10.5.2 命令控制器(BaseCommandController) 10.5.3 表单控制器(SimpleFormController) 10.5.4 多动作控制器(MultiActionController) 10.6 Spring的...

    java微信公众号MVC开发框架

    spring配置文件中唯一需要配置的bean是WeixinConfigurer类,是可选配置,但里面封装了微信接口服务类,建议一定要配置进spring配置文件中。 1、微信接口服务 微信接口服务类位于...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    10.5 Spring的控制器(Controller) 10.5.1 Controller接口 10.5.2 命令控制器(BaseCommandController) 10.5.3 表单控制器(SimpleFormController) 10.5.4 多动作控制器(MultiActionController) 10.6 Spring的...

    Java Web 的信息管理类的系统的设计与实现 人力资源管理系统 Java 大作业

    在整体系统设计框架中主要是采用了MVC架构,使用该架构主要是因为其可以简化后期对项目的修改、扩展等维护操作、使项目的某一部分变得可以重复利用和使项目的结构更加直观。 视图(View):主要为前端界面显示所需...

    java面试题

    答:运行时异常时(JVM)java虚拟机在运行过程中发生的问题,比如:内存溢出等问题。这类异常没法要求程序员去一一捕获并抛出,一般异常是Java类库或程序员自己写的代码发生的错误,这类异常可以由我们去一一捕获并...

    springmvc教程

    springmvc经典教程1.MVC:Model-View-Control框架性质的C层要完成的主要工作:封装web请求为一个数据对象、调用业务逻辑层来处理数据对象、返回处理数据结果及相应的视图给用户。2.简要概述springmvcSpring C 层框架...

    火炬博客系统7

    持久层用于分离业务逻辑和数据存取,把数据封装在DAO中,负责与数据库进行联络的一些任务都封装在此。 各个层可以单独开发,互相的耦合度很低,这在开发大项目的过程中尤其有优势,层与层之间通过调用接口...

    火炬博客系统5

    持久层用于分离业务逻辑和数据存取,把数据封装在DAO中,负责与数据库进行联络的一些任务都封装在此。 各个层可以单独开发,互相的耦合度很低,这在开发大项目的过程中尤其有优势,层与层之间通过调用接口...

Global site tag (gtag.js) - Google Analytics