CRM 全局异常处理

1.建立全局常量类:项目中多处使用到硬编码的状态码和状态描述属性,构建全局常量类替换。 CrmConstants.java
package com.shsxt.crm.base.constants;

/**
 * 全局常量
 */
public class CrmConstants {

    // 状态编码
    public static final Integer OPS_SUCCESS_CODE = 200;
    // 状态描述
    public static final String OPS_SUCCESS_MESSAGE = "操作成功";

    // 状态编码
    public static final Integer OPS_FAILED_CODE = 400;
    // 状态描述
    public static final String OPS_FAILED_MESSAGE = "操作失败";

}

2.全局异常类:GlobalExceptionResolver.java

package com.shsxt.crm.base.exception;

import com.alibaba.fastjson.JSON;
import com.shsxt.crm.base.BaseResult;
import com.shsxt.crm.base.constants.CrmConstants;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 全局异常类
 */
@Component
public class GlobalExceptionResolver implements HandlerExceptionResolver {

    /**
     * 异常处理
     *
     * @param request       请求对象
     * @param response      响应对象
     * @param handler       请求的目标方法对象 json方法 跳转页面方法
     * @param e             异常对象
     * @return
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest request,
                                         HttpServletResponse response,
                                         Object handler, Exception e) {

        // 构建默认返回对象
        ModelAndView mv = buildModelAndView(request, e);

        // 判断是否是系统异常
        if (!(handler instanceof HandlerMethod))
            return mv;

        // 判断请求的方法是json还是跳转页面
        // 强转对象类型
        HandlerMethod method = (HandlerMethod) handler;
        // 获取ResponseBody注解
        ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class);
        // json请求
        if (null != responseBody) {
            BaseResult baseResult = new BaseResult(CrmConstants.OPS_FAILED_CODE,
                    CrmConstants.OPS_FAILED_MESSAGE);

            // 判断是否是参数异常
            if (e instanceof ParamsException) {
                ParamsException pe = (ParamsException) e;
                baseResult.setCode(pe.getCode());
                baseResult.setMessage(pe.getMessage());
            }

            // 设置请求数据头信息
            // 初始化 Response 构建JSON对象
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/json;charset=utf-8");
            PrintWriter pw = null;
            try {
                pw = response.getWriter();
                pw.write(JSON.toJSONString(baseResult));
                pw.flush();
            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                if (null != pw)
                    pw.close();
            }
            return null;
        } else {
            // 跳转页面
            // 判断是否是参数异常
            if (e instanceof ParamsException) {
                ParamsException pe = (ParamsException) e;
                mv.addObject("errorMsg", e.getMessage());
            }
        }
        return mv;
    }

    // 构建默认的返回对象
    private ModelAndView buildModelAndView(HttpServletRequest request, Exception e) {
        request.setAttribute("ctx", request.getContextPath());
        request.setAttribute("uri", request.getRequestURI());
        ModelAndView mv = new ModelAndView();
        mv.setViewName("error");
        mv.addObject("errorMsg", e.getMessage());
        return mv;
    }

}

3.参数异常类优化

package com.shsxt.crm.base.exception;

import com.shsxt.crm.base.constants.CrmConstants;

/**
 * 参数异常
 */
public class ParamsException extends RuntimeException {

    private Integer code = CrmConstants.OPS_FAILED_CODE;
    private String message = "参数异常";

    public ParamsException() {
    }

    public ParamsException(Integer code, String message) {
        super(message);
        this.code = code;
        this.message = message;
    }

    public ParamsException(Integer code) {
        super("参数异常");
        this.code = code;
    }

    public ParamsException(String message) {
        super(message);
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

4.公共返回对象优化
package com.shsxt.crm.base;

import com.shsxt.crm.base.constants.CrmConstants;

import java.io.Serializable;

/**
 * 公共返回对象
 */
public class BaseResult implements Serializable {

    // 状态编码
    private Integer code = CrmConstants.OPS_SUCCESS_CODE;
    // 状态描述
    private String message = CrmConstants.OPS_SUCCESS_MESSAGE;
    // 返回对象
    private Object result;

    public BaseResult() {
    }

    public BaseResult(String message) {
        this.message = message;
    }

    public BaseResult(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public BaseResult(Integer code, Object result) {
        this.code = code;
        this.result = result;
    }

    public BaseResult(String message, Object result) {
        this.message = message;
        this.result = result;
    }

    public BaseResult(Integer code, String message, Object result) {
        this.code = code;
        this.message = message;
        this.result = result;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getResult() {
        return result;
    }

    public void setResult(Object result) {
        this.result = result;
    }
}

5.控制层代码优化
package com.shsxt.crm.system.controller;

import com.shsxt.crm.base.BaseResult;
import com.shsxt.crm.base.util.Base64Util;
import com.shsxt.crm.base.util.CookieUtil;
import com.shsxt.crm.system.model.UserModel;
import com.shsxt.crm.system.pojo.User;
import com.shsxt.crm.system.service.UserServiceI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

/**
 * 用户controller
 * Created by Administrator on 2019/8/26.
 */
@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserServiceI userServiceI;

    /**
     * 用户登录
     *
     * @param request
     * @return
     */
    @RequestMapping("/login")
    @ResponseBody
    public BaseResult userLogin(HttpServletRequest request, User user, String rememberMe) {
        request.setAttribute("ctx", request.getContextPath());
        UserModel userModel = userServiceI.userLogin(user, rememberMe);
        //将用户信息存入session
        request.getSession().setAttribute("user", userModel);
        return new BaseResult("登录成功", userModel);
    }

    /**
     * 安全退出
     *
     * @param request
     * @return
     */
    @RequestMapping("/logout")
    public String userLogout(HttpServletRequest request) {
        request.setAttribute("ctx", request.getContextPath());
        //清除session信息
        request.getSession().removeAttribute("user");
        return "login";
    }

    @RequestMapping("/updateUserPwd")
    @ResponseBody
    public BaseResult updateUserPwd(HttpServletRequest request, String oldPassword,
                                    String newPassword, String confirmPassword) {
        //从cookie获取用户加密id
        String userIdStr = CookieUtil.getCookieValue(request, "userIdStr");
        //将获取的加密id解密
        Integer id = Integer.valueOf(Base64Util.decoder(userIdStr));
        //修改密码
        userServiceI.updateUserPwd(id, oldPassword, newPassword, confirmPassword);
        return new BaseResult("修改成功");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值