新建一个只用来处理异常的包: 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; } }