全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Spring MVC全局异常处理和单元测试_动力节点Java学院整理

在spring MVC的配置文件中:

<!-- 总错误处理--> 
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
  <property name="defaultErrorView">  
    <value>/error/error</value> 
  </property> 
  <property name="defaultStatusCode">  
    <value>500</value> 
  </property>   
<property name="warnLogCategory">  
    <value>org.springframework.web.servlet.handler.SimpleMappingExceptionResolver</value> 
  </property>   
</bean>

这里主要的类是SimpleMappingExceptionResolver类,和他的父类AbstractHandlerExceptionResolver类。

具体可以配置哪些属性,我是通过查看源码知道的。

你也可以实现HandlerExceptionResolver接口,写一个自己的异常处理程序。spring的扩展性是很好的。

通过SimpleMappingExceptionResolver我们可以将不同的异常映射到不同的jsp页面(通过exceptionMappings属性的配置)。

同时我们也可以为所有的异常指定一个默认的异常提示页面(通过defaultErrorView属性的配置),如果所抛出的异常在exceptionMappings中没有对应的映射,则Spring将用此默认配置显示异常信息。

注意这里配置的异常显示界面均仅包括主文件名,至于文件路径和后缀已经在viewResolver中指定。如/error/error表示/error/error.jsp

显示错误的jsp页面:

<%@ page language="java" contentType="text/html; charset=GBK" 
  pageEncoding="GBK"%> 
<%@ page import="java.lang.Exception"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=GBK"> 
<title>错误页面</title> 
</head> 
<body> 
<h1>出错了</h1> 
<% 
Exception e = (Exception)request.getAttribute("exception"); 
out.print(e.getMessage()); 
%> 
</body> 
</html> 

其中一句:request.getAttribute("exception"),key是exception,也是在SimpleMappingExceptionResolver类默认指定的,是可能通过配置文件修改这个值的,大家可以去看源码。

如何把全局异常记录到日志中?

在前的配置中,其中有一个属性warnLogCategory,值是“SimpleMappingExceptionResolver类的全限定名”。我是在SimpleMappingExceptionResolver类父类AbstractHandlerExceptionResolver类中找到这个属性的。查看源码后得知:如果warnLogCategory不为空,spring就会使用apache的org.apache.commons.logging.Log日志工具,记录这个异常,级别是warn。值:“org.springframework.web.servlet.handler.SimpleMappingExceptionResolver”,是“SimpleMappingExceptionResolver类的全限定名”。这个值不是随便写的。  因为我在log4j的配置文件中还要加入log4j.logger.org.springframework.web.servlet.handler.SimpleMappingExceptionResolver=WARN,保证这个级别是warn的日志一定会被记录,即使log4j的根日志级别是ERROR。

 如何给spring3 MVC中的Action做JUnit单元测试?

 使用了spring3 MVC后,给action做单元测试变得很方便,我以前从来不给action写单元测试的,现在可以根据情况写一些了。 不用给每个Action都写单元测试吧,自己把握。

JUnitActionBase类是所有JUnit的测试类的父类

package test; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.junit.BeforeClass; 
import org.springframework.mock.web.MockServletContext; 
import org.springframework.web.context.WebApplicationContext; 
import org.springframework.web.context.support.XmlWebApplicationContext; 
import org.springframework.web.servlet.HandlerAdapter; 
import org.springframework.web.servlet.HandlerExecutionChain; 
import org.springframework.web.servlet.HandlerMapping; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter; 
import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping; 
/** 
* 说明: JUnit测试action时使用的基类 
* 
* 
*  
*/  
public class JUnitActionBase { 
  private static HandlerMapping handlerMapping; 
  private static HandlerAdapter handlerAdapter; 
  /** 
   * 读取spring3 MVC配置文件 
   */ 
  @BeforeClass 
 public static void setUp() { 
    if (handlerMapping == null) { 
      String[] configs = { "file:src/springConfig/springMVCxml" }; 
      XmlWebApplicationContext context = new XmlWebApplicationContext(); 
      context.setConfigLocations(configs); 
      MockServletContext msc = new MockServletContext(); 
      context.setServletContext(msc);     context.refresh(); 
      msc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context); 
      handlerMapping = (HandlerMapping) context 
          .getBean(DefaultAnnotationHandlerMapping.class); 
      handlerAdapter = (HandlerAdapter) context.getBean(context.getBeanNamesForType(AnnotationMethodHandlerAdapter.class)[0]);   
    } 
  } 
 
  /** 
   * 执行request对象请求的action 
   * 
   * @param request 
   * @param response 
   * @return 
   * @throws Exception 
   */ 
  public ModelAndView excuteAction(HttpServletRequest request, HttpServletResponse response) 
 throws Exception { 
    HandlerExecutionChain chain = handlerMapping.getHandler(request); 
    final ModelAndView model = handlerAdapter.handle(request, response, 
        chain.getHandler()); 
    return model; 
  } 
} 

这是个JUnit测试类,我们可以new Request对象,来参与测试,太方便了。给request指定访问的URL,就可以请求目标Action了。

package test.com.app.user; 
import org.junit.Assert; 
import org.junit.Test; 
import org.springframework.mock.web.MockHttpServletRequest; 
import org.springframework.mock.web.MockHttpServletResponse; 
import org.springframework.web.servlet.ModelAndView; 
 
import testJUnitActionBase; 
 
/** 
* 说明: 测试OrderAction的例子 
* 
*  
*  
*/  
 
public class TestOrderAction extends JUnitActionBase { 
  @Test 
  public void testAdd() throws Exception { 
  MockHttpServletRequest request = new MockHttpServletRequest(); 
    MockHttpServletResponse response = new MockHttpServletResponse(); 
    request.setServletPath("/order/add"); 
    request.addParameter("id", "1002"); 
    request.addParameter("date", "2010-12-30"); 
    request.setMethod("POST"); 
    // 执行URI对应的action 
    final ModelAndView mav = this.excuteAction(request, response); 
    // Assert logic 
    Assert.assertEquals("order/add", mav.getViewName()); 
    String msg=(String)request.getAttribute("msg"); 
    System.out.println(msg); 
  } 
} 

需要说明一下 :由于当前最想版本的Spring(Test) 3.0.5还不支持@ContextConfiguration的注解式context file注入,所以还需要写个setUp处理下,否则类似于Tiles的加载过程会有错误,因为没有ServletContext。3.1的版本应该有更好的解决方案。


# Spring  # MVC全局异常  # MVC  # 单元测试  # Java SpringMVC拦截器与异常处理机制详解分析  # Java SpringMVC 异常处理SimpleMappingExceptionResolver类  # Java SpringMVC异常处理机制详解  # Java 超详细讲解Spring MVC异常处理机制  # 配置文件  # 是在  # 我们可以  # 自己的  # 我是  # 就会  # 很好  # 会有  # 我在  # 一句  # 你也  # 还不  # 也可  # 错了  # 去看  # 不给  # 可以实现  # 这是个  # 可以根据 


相关文章: 网站制作知乎推荐,想做自己的网站用什么工具比较好?  建站主机默认首页配置指南:核心功能与访问路径优化  如何快速搭建安全的FTP站点?  网站制作免费,什么网站能看正片电影?  高端建站如何打造兼具美学与转化的品牌官网?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何在宝塔面板中创建新站点?  如何基于云服务器快速搭建个人网站?  如何在万网开始建站?分步指南解析  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  模具网站制作流程,如何找模具客户?  上海网站制作开发公司,上海买房比较好的网站有哪些?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  北京企业网站设计制作公司,北京铁路集团官方网站?  如何通过可视化优化提升建站效果?  已有域名和空间如何搭建网站?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  Python如何创建带属性的XML节点  ,在苏州找工作,上哪个网站比较好?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  网站制作公司排行榜,抖音怎样做个人官方网站  魔毅自助建站系统:模板定制与SEO优化一键生成指南  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  网站企业制作流程,用什么语言做企业网站比较好?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  营销式网站制作方案,销售哪个网站招聘效果最好?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  黑客如何通过漏洞一步步攻陷网站服务器?  音乐网站服务器如何优化API响应速度?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  如何在云主机快速搭建网站站点?  ,购物网站怎么盈利呢?  建站之星如何取消后台验证码生成?  如何在新浪SAE免费搭建个人博客?  如何快速搭建高效简练网站?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  ,石家庄四十八中学官网?  如何用AWS免费套餐快速搭建高效网站?  如何用wdcp快速搭建高效网站?  如何通过虚拟主机空间快速建站?  建站三合一如何选?哪家性价比更高?  网站制作需要会哪些技术,建立一个网站要花费多少?  C#怎么创建控制台应用 C# Console App项目创建方法  如何制作算命网站,怎么注册算命网站?  广平建站公司哪家专业可靠?如何选择?  如何彻底删除建站之星生成的Banner? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。