spring全局异常处理

新建一个只用来处理异常的包:   exception

在包中新一个异常处理类:继承与总异常:RuntimeException

package com.lanou.demo.exception;
//认证异常
public class AuthenticationException extends RuntimeException{

    public AuthenticationException() {
    }
    public AuthenticationException(String message) {
        super(message);
    }
}

在新建自己想要处理的异常,这里例举登录时的异常处理:

建立用户名错误异常,继承与上面建立的异常认证:

package com.lanou.demo.exception;
//用户名错误时接受的异常
public class UnknownUsernameException extends AuthenticationException {

    public UnknownUsernameException() {
    }

    public UnknownUsernameException(String message) {
        super(message);
    }
}

建立密码错异常,同样继承与上面建立的异常认证:

package com.lanou.demo.exception;
//密码错误时接受的异常
public class WrongPasswordException extends AuthenticationException {

    public WrongPasswordException() {
    }
    public WrongPasswordException(String message) {
        super(message);
    }
}

在@Service部分做抛出异常,判断异常类型:
@Service
public class UserServiceImpl implements UserService {
    @Override
    public UserBean login(String username, String password) {
        if ("admin".equals(username)){
            if ("admin".equals(password)){
                 UserBean user = new UserBean();
                 user.setUsername("admin");
            } else {
                throw new WrongPasswordException();
            }
        } else {
            // 用户名在数据库中不存在, 抛出 未知用户名异常
            throw new UnknowUsernameException();
        }
        return null;
    }
}

 

创建异常解析器,根据异常的类型做进一步处理:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//只需要让Spring创建这个bean就可以直接生效,配置文件不需要配置
@Component
public class GlobalExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView mv = new ModelAndView();
        //在这儿统一的判断异常集体的类型,根据不同的异常返回不同的信息
        if (ex instanceof UnknownUsernameException){

            mv.addObject("message","用户名不存在");
            mv.setView(new MappingJackson2JsonView());

        }else {
            ex.printStackTrace();
            mv.addObject("message","服务器开小差了");
            mv.setView(new MappingJackson2JsonView());
        }
        return null;
    }
}

 

posted on 2019-05-22 21:04  周昌洋  阅读(183)  评论(0编辑  收藏  举报

导航