经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Spring MVC 异常处理 (九)
来源:cnblogs  作者:黄浩#  时间:2018/11/8 9:57:01  对本文有异议

完整的项目案例: springmvc.zip

目录

 

实例

除了依赖spring-webmvc还需要依赖jackson-databind(用于转换json数据格式)

  1. <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.6</version>
    </dependency>

    项目结构:

 

配置web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6.  
  7. <!-- 请求总控器 -->
  8. <servlet>
  9. <servlet-name>dispatcher</servlet-name>
  10. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  11. <init-param>
  12. <param-name>contextConfigLocation</param-name>
  13. <param-value>classpath:dispatcher-servlet.xml</param-value>
  14. </init-param>
  15. </servlet>
  16. <servlet-mapping>
  17. <servlet-name>dispatcher</servlet-name>
  18. <url-pattern>/</url-pattern>
  19. </servlet-mapping>
  20.  
  21. </web-app>
View Code

配置dispatcher-servlet.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. 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">
  6.  
  7. <context:component-scan base-package="edu.nf.ch09"/>
  8.  
  9. <mvc:annotation-driven/>
  10.  
  11. <mvc:default-servlet-handler/>
  12.  
  13. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  14. <property name="prefix" value="/WEB-INF/jsp/"/>
  15. <property name="suffix" value=".jsp"/>
  16. </bean>
  17.  
  18. </beans>
View Code

Controller (UserController)

  1. package edu.nf.ch09.controller;
  2. import edu.nf.ch09.controller.vo.ResponseVO;
  3. import edu.nf.ch09.entity.Users;
  4. import edu.nf.ch09.service.UserService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.PostMapping;
  8. import org.springframework.web.bind.annotation.ResponseBody;
  9. import javax.servlet.http.HttpSession;
  10. /**
  11. * @author wangl
  12. * @date 2018/11/5
  13. */
  14. @Controller
  15. public class UserController {
  16. @Autowired
  17. private UserService userService;
  18. /**
  19. * 局部异常处理方法
  20. *
  21. * @ExceptionHandler标注的方法用于专门处理请求方法抛出的异常
  22. * value属性指定异常的Class对象(是一个数组,可以指定多个class),
  23. * 表示捕获什么样的异常对象,最后在标注的方法中传入一个异常参数,就可以得到相应的异常对象
  24. * 注意:@ExceptionHandler标注的方法只在当前的Controller类中有效,
  25. * 在其他类中必须重新编写相关的Handler异常处理方法,
  26. * 如果希望让所有的Controller都共享一个Handler异常处理,那么可以配置为全局异常处理
  27. *
  28. * @return
  29. */
  30. /*@ExceptionHandler(UserException.class)
  31. public ResponseVO handlerException(RuntimeException e){
  32. ResponseVO vo = new ResponseVO();
  33. vo.setCode(401);
  34. vo.setMessage(e.getMessage());
  35. return vo;
  36. }*/
  37.  
  38. /**
  39. * 用户登陆
  40. * @param user
  41. * @param session
  42. * @return
  43. */
  44. @PostMapping("/userLogin")
  45. @ResponseBody
  46. public ResponseVO login(Users user, HttpSession session){
  47. ResponseVO vo = new ResponseVO();
  48. //如果login方法引发了异常,则会执行上面的handlerLoginException异常处理方法
  49. user = userService.login(user);
  50. session.setAttribute("user", user);
  51. vo.setValue("index.html");
  52. return vo;
  53. }
  54. @PostMapping("/addUser")
  55. @ResponseBody
  56. public ResponseVO addUser(Users user){
  57. userService.addUser(user);
  58. return new ResponseVO();
  59. }
  60. }

ExceptionAdvice(全局的异常处理类)

  1. package edu.nf.ch09.controller.advice;
  2. import edu.nf.ch09.controller.vo.ResponseVO;
  3. import edu.nf.ch09.service.exception.DataAccessException;
  4. import edu.nf.ch09.service.exception.UserException;
  5. import org.springframework.web.bind.annotation.ControllerAdvice;
  6. import org.springframework.web.bind.annotation.ExceptionHandler;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. /**
  9. * @author wangl
  10. * @date 2018/11/5
  11. * 定义一个全局的异常处理类(类似一个切面)
  12. * 这个类中定义的所有方法都是异常处理方法,
  13. * 也可以理解为是全局的异常通知
  14. * value属性指定对哪些控制器进行切入拦截
  15. */
  16. @ControllerAdvice("edu.nf.ch09.controller")
  17. public class ExceptionAdvice {
  18. /**
  19. * 全局异常处理方法
  20. * 用于处理用户登陆异常
  21. * @param e
  22. * @return
  23. */
  24. @ExceptionHandler(UserException.class)
  25. @ResponseBody
  26. public ResponseVO handlerLoginException(RuntimeException e){
  27. ResponseVO vo = new ResponseVO();
  28. vo.setCode(401);
  29. vo.setMessage(e.getMessage());
  30. return vo;
  31. }
  32. /**
  33. * 全局异常处理方法
  34. * 用于处理crud操作
  35. * @param e
  36. * @return
  37. */
  38. @ExceptionHandler(DataAccessException.class)
  39. @ResponseBody
  40. public ResponseVO handlerDataAccessException(RuntimeException e){
  41. ResponseVO vo = new ResponseVO();
  42. vo.setCode(500);
  43. vo.setMessage(e.getMessage());
  44. return vo;
  45. }
  46. }

持久层引发的异常

  1. package edu.nf.ch09.dao.impl;
  2. import edu.nf.ch09.dao.UserDao;
  3. import edu.nf.ch09.entity.Users;
  4. import edu.nf.ch09.service.exception.DataAccessException;
  5. import org.springframework.stereotype.Repository;
  6. /**
  7. * @author wangl
  8. * @date 2018/11/5
  9. */
  10. @Repository
  11. public class UserDaoImpl implements UserDao {
  12. @Override
  13. public Users getUserByName(String userName) {
  14. Users user = null;
  15. if("user1".equals(userName)){
  16. user = new Users();
  17. user.setUserName("user1");
  18. user.setPassword("123456");
  19. }
  20. return user;
  21. }
  22. @Override
  23. public void saveUser(Users user) {
  24. System.out.println("insert into user_info values ...");
  25. throw new DataAccessException("添加失败");
  26. }
  27. }
View Code

业务逻辑层引发的异常

  1. package edu.nf.ch09.service.impl;
  2. import edu.nf.ch09.dao.UserDao;
  3. import edu.nf.ch09.entity.Users;
  4. import edu.nf.ch09.service.UserService;
  5. import edu.nf.ch09.service.exception.UserException;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. /**
  9. * @author wangl
  10. * @date 2018/11/5
  11. */
  12. @Service
  13. public class UserServiceImpl implements UserService {
  14. @Autowired
  15. private UserDao userDao;
  16. @Override
  17. public Users login(Users user) {
  18. Users newUser = userDao.getUserByName(user.getUserName());
  19. if(newUser == null){
  20. throw new UserException("用户不存在");
  21. }
  22. if(!user.getPassword().equals(newUser.getPassword())){
  23. throw new UserException("密码错误");
  24. }
  25. return newUser;
  26. }
  27. @Override
  28. public void addUser(Users user) {
  29. userDao.saveUser(user);
  30. }
  31. }
View Code

页面收到异常消息

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号