利用springmvc提供一个HandlerExceptionResolver接口实现出错返回Json数据

刚开始实现之前网上搜索了一番,发现解决方法都不是很好,也不是很方便,然后自己就开始摸索了。

首先成功的时候返回了前端期望json数据,失败的时候调用了springmvc提供HandlerExceptionResolver接口,出错信息就全部显示了(除了我们定义的),那么问题来了,不是我们想要的json格式啊。

然后开始解决问题了:

springMvc对出错的处理都是输出到jsp/error.jsp下,成功的就是jsp/success.jsp,那么我们就在这里做文章了,到error.jsp中把输出的格式化内容删掉,只让其输出文本就可以了。success.jsp同理。

然后我们把我们实现的出错的接口的errorMessage输出的内容也格式化为Json就OK了。


下面贴一下我工程的代码:

error.jsp

<%@ page contentType="application/json;charset=UTF-8" language="java" %>
${message}


success.jsp

<%@ page contentType="application/json;charset=UTF-8" language="java" %>
{"status":"success","result":"操作成功"}



CustomExceptionResolve.java

package com.amoxu.exception;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 *    全局异常处理器
 *    springmvc提供一个HandlerExceptionResolver接口
 *      只要实现该接口,并配置到spring 容器里,该类就能
 *      成为默认全局异常处理类
 *
 *   全局异常处理器只有一个,配置多个也没用。
 */
public class CustomExceptionResolver implements HandlerExceptionResolver {
    public ModelAndView resolveException(HttpServletRequest httpServletRequest,
                                         HttpServletResponse httpServletResponse,
                                         Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();
        CustomException customException;
        if (e instanceof CustomException) {
            customException = (CustomException)e;
        } else if (e instanceof UnknownAccountException) {
            //用户名错误异常
            modelAndView.addObject("message", "{\"status\":\"false\",\"result\":\"用户不存在\"}");
            modelAndView.setViewName("error");
            return modelAndView;
        } else if (e instanceof IncorrectCredentialsException) {
            //用户名密码异常
            modelAndView.addObject("message", "{\"status\":\"false\",\"result\":\"密码错误\"}");
            modelAndView.setViewName("error");
            return modelAndView;
        } else {
            customException = new CustomException("{\"status\":\"false\",\"result\":\"未知错误\"}");
        }
        //错误信息
        String message = customException.getMessage();
        //错误信息传递和错误页面跳转
        modelAndView.addObject("message", message);
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

CustomException.java
package com.amoxu.exception;

/**
 *  系统自定义异常类,针对预期异常,需要在程序中抛出此类的异常
 */
public class CustomException extends Exception {

    //异常信息
    public String message;

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

    public String getMessage() {
        return message;
    }

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

 
loginRealm.java部分抛出异常的代码
if (userlogin == null) {
    //没有该用户名
    throw new UnknownAccountException();
} else if (!password.equals(userlogin.getPsw())) {
    //密码错误
    throw new IncorrectCredentialsException();
}
 
 
恩,还有ajax部分的代码
<script>
    $(document).ready(function(){
        $("#login").click(function(){
            $.ajax({
                url:"/login",
                type:"POST",
		//构造post参数,如果是需要Json格式的参数,调用 JSON.stringify()
		//contentType:"application/json",
		//data: JSON.stringify({"context":$("#message").val(),"ver":$("#ver").val()}) ,
		//参数列表
               data:"username="+$("#username").val()+"&password="+$("#password").val(),
                success:function(result){
                },
                error:function (result) {
                }
            });
        });
    });
</script>

还有一个SpringMvc.xml中的配置
<!--全局错误信息处理器
只要实现HandlerExceptionResolver接口就是全局异常处理器
-->
<bean class="com.amoxu.exception.CustomExceptionResolver"/>

posted @ 2017-10-04 15:18  amoxuk  阅读(92)  评论(0)    收藏  举报