利用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":"操作成功"}
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"/>

浙公网安备 33010602011771号