改造前:
public CodeMsg login(LoginVo loginVo) {
if(loginVo==null){
return CodeMsg.SERVER_ERROR;
}
String mobile=loginVo.getMobile();
String formPassword=loginVo.getPassword();;
//判断手机号是否存在
User user=getById(Long.parseLong(mobile));
if (user == null) {
return CodeMsg.MOBILE_NOT_EXIST;
}
String dbPassword=user.getPassword();
String salt=user.getSalt();
String calcPassword=MD5Util.formPwdToDBPwd(formPassword,salt);
if(!StringUtils.equals(dbPassword,calcPassword)){
return CodeMsg.PASSWORD_ERROR;
}
return CodeMsg.SUCCESS;
}
问题:
业务代码逻辑不清晰,登录这种应用,返回成功或者失败即可。
修改后:
1.创建一个自定义异常GlobalException:
public class GlobalException extends RuntimeException {
private CodeMsg cm;
public GlobalException(CodeMsg cm){
super(cm.toString());
this.cm=cm;
}
public CodeMsg getCm() {
return cm;
}
}
2.对原有异常部分,直接抛出异常:
遇到异常情况,直接抛出。
public boolean login(LoginVo loginVo) {
if(loginVo==null){
throw new GlobalException(CodeMsg.SERVER_ERROR);
}
String mobile=loginVo.getMobile();
String formPassword=loginVo.getPassword();;
//判断手机号是否存在
User user=getById(Long.parseLong(mobile));
if (user == null) {
throw new GlobalException(CodeMsg.MOBILE_NOT_EXIST);
}
String dbPassword=user.getPassword();
String salt=user.getSalt();
String calcPassword=MD5Util.formPwdToDBPwd(formPassword,salt);
if(!StringUtils.equals(dbPassword,calcPassword)){
throw new GlobalException(CodeMsg.PASSWORD_ERROR);
}
return true;
}
3.定义一个全局异常处理器
a.注解ControllerAdvice,以控制器作为切面,aop拦截异常
b.@ExceptionHandler(value = Exception.class)控制拦截的异常范围
c.针对不同的异常类型,做单独处理
@ControllerAdvice //控制器切面
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)//所有的异常都拦截
public Result<String> exceptionHandler(HttpServletRequest request,Exception exception){
if(exception instanceof GlobalException){
GlobalException globalException=(GlobalException) exception;
return Result.error(globalException.getCm());
}else if(exception instanceof BindException){
BindException bindException=(BindException) exception;
List<ObjectError> errorList=bindException.getAllErrors();
ObjectError error=errorList.get(0);
String msg=error.getDefaultMessage();
return Result.error(CodeMsg.BIND_EXCEPTION.fillArgs(msg));
}else{
return Result.error(CodeMsg.SERVER_ERROR);
}
}
}