首页 > 其他分享 >spring mvc3及mvc 3.2中的异常处理小结

spring mvc3及mvc 3.2中的异常处理小结

时间:2022-12-05 10:03:28浏览次数:41  
标签:mvc3 spring exceptionMsg class mvc IOException ex ModelAndView public


在spring mvc 3中,处理异常的是试用exceptionresolver去做异常,先来个简单DEMO看下:

1) 自定义异常类

public class SpringException extends RuntimeException{

private String exceptionMsg;

public SpringException(String exceptionMsg) {
this.exceptionMsg = exceptionMsg;
}

public String getExceptionMsg(){
return this.exceptionMsg;
}

public void setExceptionMsg(String exceptionMsg) {
this.exceptionMsg = exceptionMsg;
}
}



2) 一个简单的控制器,其中用到了注解


@Controller
public class StudentController {

@RequestMapping(value = "/student", method = RequestMethod.GET)
public ModelAndView student() {
return new ModelAndView("student", "command", new Student());
}

@RequestMapping(value = "/addStudent", method = RequestMethod.POST)
@ExceptionHandler({SpringException.class})
public String addStudent( @ModelAttribute("HelloWeb")Student student,
ModelMap model) {

if(student.getName().length() < 5 ){
throw new SpringException("Given name is too short");
}else{
model.addAttribute("name", student.getName());
}

}
}



3 在传统的xxxx-servlet.xml中配置SimpleMappingExceptionResolver



<bean class="org.springframework.web.servlet.handler.
SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="com.tutorialspoint.SpringException">
ExceptionPage
</prop>
</props>
</property>
<property name="defaultErrorView" value="error"/>



其中 ExceptionPage.jsp得定义出来,如下页面:



<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<html>
<head>
<title>Spring MVC Exception Handling</title>
</head>
<body>

<h2>Spring MVC Exception Handling</h2>

<h3>${exception.exceptionMsg}</h3>

</body>
</html>



这样当有异常的话,就出现ExceptionPage.jsp的页面了;


注意一下,使用:


@ExceptionHandler(IOException.class)



public ModelAndView handleIOException(IOException ex) {


则凡是IOException的子类异常的话,也会用handleIOException方法去处理的喔';



可以看到,其实在spring mvc3中,如果使用



@ExceptionHandler(IOException.class)

public ModelAndView handleIOException(IOException ex) {



这个方法,其弊端在于,一个controller只能搭配响应一类异常,也就是说,


只能处理同一个controller中出现的ioexception;在最新的spring mvc 3.2中,比如DEMO如下:




@Controller
public class UserCreditCardController {

private static final Logger logger = LoggerFactory.getLogger(UserCreditCardController.class);


@RequestMapping(value = "userdetails", method = RequestMethod.GET)
public String getCardDetails(Model model) throws IOException {

logger.info("This will throw an IOException");

boolean throwException = true;

if (throwException) {
throw new IOException("This is my IOException");
}

return "home";
}

}



还有一个controller:


@Controller
public class UserAddressController {

private static final Logger logger = LoggerFactory.getLogger(UserAddressController.class);


@RequestMapping(value = "useraddress", method = RequestMethod.GET)
public String getUserAddress(Model model) throws IOException {

logger.info("This will throw an IOException");

boolean throwException = true;

if (throwException) {
throw new IOException("This is my IOException");
}

return "home";
}

}



两个controller都抛出了IOException的异常,则统一处理的为:



@ControllerAdvice
public class MyControllerAdviceDemo {

private static final Logger logger = LoggerFactory.getLogger(MyControllerAdviceDemo.class);

@Autowired
private UserDao userDao;

@ExceptionHandler(IOException.class)
public ModelAndView handleIOException(IOException ex) {

logger.info("handleIOException - Catching: " + ex.getClass().getSimpleName());
return errorModelAndView(ex);
}


private ModelAndView errorModelAndView(Exception ex) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("error");
modelAndView.addObject("name", ex.getClass().getSimpleName());
modelAndView.addObject("user", userDao.readUserName());

return modelAndView;
}
}


这样一来,使用了@ControllerAdvice标签,则无论应用中有多少个controller,只要


其中一个抛出IOException,都会使用 MyControllerAdviceDemo 去处理了;


标签:mvc3,spring,exceptionMsg,class,mvc,IOException,ex,ModelAndView,public
From: https://blog.51cto.com/u_14230175/5911337

相关文章

  • Spring中配合hibernate使用的简单例子
    最近在看SPRING和hibernate,学习了spring和hibernate之间整合,下面举出一个例子予以说明.    首先,可以注入的是sessionfactory,因为sessionfactory的Datasource可以......
  • spring 3 jdbc常用小结
    spring3的jdbc跟springmvc搭配起来挺好用的,本文试着小结其主要使用方法,并举出spring3.3.2中的一些信变化进行解析1)在dao中注入jdbctemplate,然后......
  • spring mvc中的拦截器小结
    在springmvc中,拦截器其实比较简单了,下面简单小结并demo下。preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们......
  • springboot_02
    1.修改配置 ky格式修改配置文件  1.1application.yml格式(一般用这种格式) ......
  • Spring实例化bean的方法
    Spring实例化bean的方法主要有四种:通过构造方法实例化bean,使用静态工厂实例化bean,使用实例工厂实例化bean,使用FactoryBean实例化bean。前三种了解即可,使用FactoryBean实例......
  • spring 动态获取配置spring获取所有配置spring运行中获取配置列表
    1:在任何springbean中注入PropertySourcesPlaceholderConfigurer对象,如:@AutowiredPropertySourcesPlaceholderConfigureraa; 2:获取当前配置中的值ObjectgetProp......
  • spring源码 自定义beanDefinition的添加逻辑
      首先我自定义了两个beandefinition,第一个会产生第二个,并且都是特殊的实现,能够避开前面的循环读取,所以,spring在最后用了一个while循环,一个flag就将,beandefinition新增......
  • SpringCloud Alibaba学习笔记
    该笔记整理至尚硅谷周阳老师的SpringCloud课程SpringCloudAlibaba篇SpringCloudAlibaba入门简介SpringCloudNetflix项目进入维护模式,SpringCloudNetflix将不再......
  • Spring validate 探索
      Springcontextvalidate包  RequestResponseBodyMethodProcessor   MethodValidationInterceptor    spring自动PrimaryDefaultValidato......
  • 快速创建spring boot 项目
    因为我装的是社区版idea, 不能安装springinitializer插件,所以只能在网站上create.GENERATE 然后下载下来即可:https://start.spring.io/ ......