Spring MVC 异常处理 (九)
完整的项目案例: springmvc.zip
目录

实例
除了依赖spring-webmvc还需要依赖jackson-databind(用于转换json数据格式)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency> 项目结构:

配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"> <!-- 请求总控器 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcher-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> </web-app>
配置dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="edu.nf.ch09"/> <mvc:annotation-driven/> <mvc:default-servlet-handler/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean> </beans>
Controller (UserController)
package edu.nf.ch09.controller; import edu.nf.ch09.controller.vo.ResponseVO;
import edu.nf.ch09.entity.Users;
import edu.nf.ch09.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpSession; /**
* @author wangl
* @date 2018/11/5
*/
@Controller
public class UserController { @Autowired
private UserService userService; /**
* 局部异常处理方法
*
* @ExceptionHandler标注的方法用于专门处理请求方法抛出的异常
* value属性指定异常的Class对象(是一个数组,可以指定多个class),
* 表示捕获什么样的异常对象,最后在标注的方法中传入一个异常参数,就可以得到相应的异常对象
* 注意:@ExceptionHandler标注的方法只在当前的Controller类中有效,
* 在其他类中必须重新编写相关的Handler异常处理方法,
* 如果希望让所有的Controller都共享一个Handler异常处理,那么可以配置为全局异常处理
*
* @return
*/
/*@ExceptionHandler(UserException.class)
public ResponseVO handlerException(RuntimeException e){
ResponseVO vo = new ResponseVO();
vo.setCode(401);
vo.setMessage(e.getMessage());
return vo;
}*/ /**
* 用户登陆
* @param user
* @param session
* @return
*/
@PostMapping("/userLogin")
@ResponseBody
public ResponseVO login(Users user, HttpSession session){
ResponseVO vo = new ResponseVO();
//如果login方法引发了异常,则会执行上面的handlerLoginException异常处理方法
user = userService.login(user);
session.setAttribute("user", user);
vo.setValue("index.html");
return vo;
} @PostMapping("/addUser")
@ResponseBody
public ResponseVO addUser(Users user){
userService.addUser(user);
return new ResponseVO();
}
}
ExceptionAdvice(全局的异常处理类)
package edu.nf.ch09.controller.advice; import edu.nf.ch09.controller.vo.ResponseVO;
import edu.nf.ch09.service.exception.DataAccessException;
import edu.nf.ch09.service.exception.UserException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; /**
* @author wangl
* @date 2018/11/5
* 定义一个全局的异常处理类(类似一个切面)
* 这个类中定义的所有方法都是异常处理方法,
* 也可以理解为是全局的异常通知
* value属性指定对哪些控制器进行切入拦截
*/
@ControllerAdvice("edu.nf.ch09.controller")
public class ExceptionAdvice { /**
* 全局异常处理方法
* 用于处理用户登陆异常
* @param e
* @return
*/
@ExceptionHandler(UserException.class)
@ResponseBody
public ResponseVO handlerLoginException(RuntimeException e){
ResponseVO vo = new ResponseVO();
vo.setCode(401);
vo.setMessage(e.getMessage());
return vo;
} /**
* 全局异常处理方法
* 用于处理crud操作
* @param e
* @return
*/
@ExceptionHandler(DataAccessException.class)
@ResponseBody
public ResponseVO handlerDataAccessException(RuntimeException e){
ResponseVO vo = new ResponseVO();
vo.setCode(500);
vo.setMessage(e.getMessage());
return vo;
}
}
持久层引发的异常
package edu.nf.ch09.dao.impl; import edu.nf.ch09.dao.UserDao;
import edu.nf.ch09.entity.Users;
import edu.nf.ch09.service.exception.DataAccessException;
import org.springframework.stereotype.Repository; /**
* @author wangl
* @date 2018/11/5
*/
@Repository
public class UserDaoImpl implements UserDao { @Override
public Users getUserByName(String userName) {
Users user = null;
if("user1".equals(userName)){
user = new Users();
user.setUserName("user1");
user.setPassword("123456");
}
return user;
} @Override
public void saveUser(Users user) {
System.out.println("insert into user_info values ...");
throw new DataAccessException("添加失败");
}
}
业务逻辑层引发的异常
package edu.nf.ch09.service.impl; import edu.nf.ch09.dao.UserDao;
import edu.nf.ch09.entity.Users;
import edu.nf.ch09.service.UserService;
import edu.nf.ch09.service.exception.UserException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; /**
* @author wangl
* @date 2018/11/5
*/
@Service
public class UserServiceImpl implements UserService { @Autowired
private UserDao userDao; @Override
public Users login(Users user) {
Users newUser = userDao.getUserByName(user.getUserName());
if(newUser == null){
throw new UserException("用户不存在");
}
if(!user.getPassword().equals(newUser.getPassword())){
throw new UserException("密码错误");
}
return newUser;
} @Override
public void addUser(Users user) {
userDao.saveUser(user);
}
}
页面收到异常消息

Spring MVC 异常处理 (九)的更多相关文章
- Spring MVC异常处理SimpleMappingExceptionResolver
Spring MVC异常处理SimpleMappingExceptionResolver[转] (2012-12-07 13:45:33) 转载▼ 标签: 杂谈 分类: 技术分享 Spring3.0中 ...
- Spring MVC异常处理代码完整实例
Spring MVC异常处理流程: 提供构造方法传值: 配置异常处理器的bean
- Spring MVC异常处理详解
Spring MVC中异常处理的类体系结构 下图中,我画出了Spring MVC中,跟异常处理相关的主要类和接口. 在Spring MVC中,所有用于处理在请求映射和请求处理过程中抛出的异常的类,都要 ...
- Spring MVC异常处理
Spring Mvc 中异常处理,一般有两种解决办法: 一.利用org.springframework.web.servlet.handler.SimpleMappingExceptionResolv ...
- Spring MVC异常处理详解(转)
下图中,我画出了Spring MVC中,跟异常处理相关的主要类和接口. 在Spring MVC中,所有用于处理在请求映射和请求处理过程中抛出的异常的类,都要实现HandlerExceptionReso ...
- Spring系列(七) Spring MVC 异常处理
Servlet传统异常处理 Servlet规范规定了当web应用发生异常时必须能够指明, 并确定了该如何处理, 规定了错误信息应该包含的内容和展示页面的方式.(详细可以参考servlet规范文档) 处 ...
- Spring MVC异常处理详解 ExceptionHandler good
@ControllerAdvice(basePackageClasses = AcmeController.class) public class AcmeControllerAdvice exten ...
- Spring MVC异常处理实例
以下内容引用自http://wiki.jikexueyuan.com/project/spring/mvc-framework/spring-exception-handling-example.ht ...
- Spring MVC异常处理 和 重定向传递数据
1.异常处理介绍 Spring在web项目中,如果在请求处理时出现异常,那输出会是Servlet响应.这时异常需要以某种方式转换为响应. Spring将异常转换为响应的方式: a.特定的Spring异 ...
随机推荐
- linq标准查询运算符
Order By操作 适用场景:对查询出的语句进行排序,比如按时间排序等等. 说明:按指定表达式对集合排序:延迟,:按指定表达式对集合排序:延迟,默认是升序,加上descending表示降序,对应的扩 ...
- 【C#写日志两个简单方法】
方法一:以日期为日志文件名. public void WriteLog(string msg) { string filePath = AppDomain.CurrentDomain.BaseDire ...
- HTTP的基本原理
用户访问万维网文档,万维网文档之间的链接以及万维网文档中数据传送到用户计算机,这些功能的实现都是由超文本传输协议 HTTP(HyperTextTransfer Protocol) 负责完成的. HTT ...
- Spring之BeanPostProcessor(后置处理器)介绍
为了弄清楚Spring框架,我们需要分别弄清楚相关核心接口的作用,本文来介绍下BeanPostProcessor接口 BeanPostProcessor 该接口我们也叫后置处理器,作用是在Be ...
- Coder解压探索===冥想补蓝v.1.0
主题是什么? 这是一篇是我自己在探索冥想术的过程中,有了一些浅薄的收获,所以写出来记录与分享. 我不太记得最早是因为什么原因去学习冥想,一开始对我而言,这个词带有很多成见,诸如“老僧入定”“三界六道” ...
- [转]使用js把Unix时间戳转化成普通日期
本文转自:https://blog.csdn.net/maggie_live/article/details/80606846 方法一: var time = 1523141099;var unixT ...
- IDEA更换主题
更换IDEA主题只需要3步 1. 下载主题 在主题网站上IDEA Color Themes 上浏览喜欢的主题并下载该主题.(如果网址有变更,google IDEA themes即可.) 2. 导入主 ...
- WinForm DataGridView 绑定泛型List(List<T>)/ArrayList不显示的原因和解决
背景:无意间遇到了一个不大不小的问题,希望对一些遇到的人有所帮助! 一.问题 WinForm DataGridView 绑定泛型List (List<T>)/ArrayList不显示,UI ...
- dll 已注册 检索 COM 类工厂中 CLSID 为 {XXXX-XXXX-XXX-XXXXX-XXX} 的组件时失败,原因是出现以下错误: 80040154。
前几天碰到的问题,错误提示“ 检索 COM 类工厂中 CLSID 为 {XXXX-XXXX-XXX-XXXXX-XXX} 的组件时失败,原因是出现以下错误: 80040154.”,然而dll已注册,注 ...
- 快速掌握JavaScript面试基础知识(三)
译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...