`

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 mvc5.0.3 所有jar包

    4. **ModelAndView对象**: 这是Spring MVC中用于封装模型数据和视图名的对象。在Controller方法中,可以返回一个ModelAndView对象,指定返回的视图和传递给视图的数据。 5. **视图解析**: Spring MVC支持多种视图...

    spring-MVC.zip_Java spring mvc_spring mvc_spring mvc

    在本实例中,我们有一个名为"spring-MVC.zip"的压缩包,里面包含了一个关于Spring MVC的开发教程,特别适合初学者进行学习。 Spring MVC的核心概念包括DispatcherServlet、Controller、Model、View和ViewModel。...

    spring mvc+mybatis封装

    - 在Spring MVC的Controller中通过@Autowired注解注入Service,然后调用Service中的方法执行数据库操作。 4. **封装**:封装主要体现在以下几个方面: - **Service层**:创建Service接口,包含业务逻辑方法,这些...

    Spring MVC 基础实例源码01

    在Spring MVC中,Model代表业务对象,View负责展示,Controller处理用户请求并协调Model和View。 2. **DispatcherServlet**:Spring MVC的入口点,它是一个前端控制器,接收所有HTTP请求,并根据配置的...

    spring mvc jar包

    3. `org.springframework.web.servlet-3.0.2.RELEASE.jar`:这是 Spring MVC 的核心模块,提供了控制器(Controller)、模型视图(ModelAndView)以及调度器Servlet(DispatcherServlet)等关键组件。...

    基本的spring mvc + spring security实现的登录(无数据库)

    在本项目中,我们主要探讨的是如何利用Spring MVC和Spring Security框架构建一个基本的无数据库登录系统。Spring MVC是Spring框架的一部分,用于处理Web应用程序的请求-响应模型,而Spring Security则是一个强大的...

    spring mvc架包

    8. **异常处理**: Spring MVC 提供了 `@ExceptionHandler` 注解,允许在 Controller 中直接处理异常,提高异常处理的灵活性。 9. **JSON 支持**: 通过集成 Jackson 或者 Gson,Spring MVC 可以方便地进行 JSON 数据...

    spring mvc 整合包

    在Spring MVC中,Controller处理请求,Model代表业务对象,View负责渲染视图。 2. **DispatcherServlet**:Spring MVC的核心组件,作为前端控制器,负责接收HTTP请求,调度请求到相应的处理器。 3. **@Controller*...

    Spring MVC学习框架

    10. **异常处理**:Spring MVC 提供了统一的异常处理机制,通过 @ExceptionHandler 或配置 ExceptionResolver,可以优雅地处理应用中的异常。 11. **RESTful 支持**:Spring MVC 通过 @RequestMapping 注解支持 ...

    spring mvc mybatis velocity 示范

    查询结果被封装为Java对象,然后传递给Spring MVC的Controller。Controller再将这些对象传给Velocity模板,Velocity根据模板和数据生成响应的HTML页面。 例如,一个典型的流程可能如下:用户发起一个请求,...

    spring MVC中文教程

    - **异常处理**:Spring MVC提供了强大的异常处理机制,可以通过@ExceptionHandler注解来处理控制器方法中抛出的异常。 - **国际化支持**:通过资源文件支持多语言,可以方便地实现应用程序的多语言支持。 #### 九...

    spring mvc与mybatis的集成

    SqlSessionTemplate 是 Spring 中对 SqlSession 的封装,提供了事务管理。 4. **创建 DAO 接口**:在 MyBatis 中,业务逻辑通常通过 Mapper 接口实现,接口的方法对应 SQL 语句。定义一个 DAO 接口,例如 `...

    Spring MVC 第一个例子

    在实际开发中,Spring MVC 还支持许多高级特性,如国际化、数据绑定、异常处理、RESTful 风格的 API 设计等,这些都是构建高效、灵活的 Web 应用程序的关键工具。了解并熟练掌握 Spring MVC 的使用,将有助于提升 ...

    两个小时学会了Spring MVC

    在上述描述中,我们看到一个开发者为了应对一个紧迫的项目,快速学习并理解了Spring MVC的核心概念。Spring MVC不仅在Java Web开发中广泛应用,而且因其灵活性和可扩展性而备受青睐。 首先,Spring MVC的设计理念是...

    学习Spring MVC,关于注解的Spring MVC,简单例子,关于控制器的Spring MVC,学习Spring,简单Spring MVC实例

    在本教程中,我们将深入探讨Spring MVC的核心概念,特别是关于注解的使用以及简单的控制器实现。 首先,Spring MVC的核心组件包括DispatcherServlet、Controller、ModelAndView、ViewResolver等。DispatcherServlet...

    spring mvc经典入门案例

    在Spring MVC 应用中,我们需要配置 `web.xml` 以注册 DispatcherServlet,同时创建一个或多个 Spring 配置文件来定义 MVC 组件。配置包括配置视图解析器、处理器映射器、拦截器等。 4. **注解驱动开发** Spring ...

    Spring MVC 文件上传下载 后端 - Java.zip

    在Spring MVC框架中,文件上传和下载是常见的功能需求,特别是在构建Web应用程序时。这个压缩包文件"Spring MVC 文件上传下载 后端 - Java.zip"包含的文档可能详细阐述了如何在Java后端实现这些功能。以下是关于...

    Spring MVC4.1.6jar包

    3. **@Controller和@RequestMapping**: 这两个注解是Spring MVC中控制器层的核心。@Controller标识一个类作为控制器,而@RequestMapping则用来映射HTTP请求到特定的方法。 4. **ModelAndView**: 这个类用于封装模型...

    综合spring mvc + spring + hibernate + bootstrap开发图书管理系统

    在本项目中,我们利用了Java技术栈中的四个核心组件:Spring MVC、Spring、Hibernate以及Bootstrap,构建了一个全面的图书管理系统。这个系统旨在提供高效、用户友好的图书管理功能,涵盖了从图书入库、检索到借阅、...

Global site tag (gtag.js) - Google Analytics