笔记十分重要,谨记!
返回数据封装
- 在我们utils包下创建统一约束
package com.mobile.utils;
import com.alibaba.druid.support.json.JSONUtils;
/**
* @Created by xzm on 2019/11/13.
* @Describe:统一返回数据约束,状态码、信息及响应数据
* @Review by:
* @Modify by:
* @Version : $ v_1.0 on 2019/11/13
* @Remark:
*/
public class BaseResponse {
private static final long serialVersionUID = 1L;
/*响应状态码*/
private int code;
/*响应提示信息*/
private String message;
/*返回业务数据*/
private Object data;
public static long getSerialVersionUID() {
return serialVersionUID;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
@Override
public String toString() {
return JSONUtils.toJSONString(this);
}
}
- 定义全局异常及方法供调用
package com.mobile.base;
import java.util.HashMap;
import java.util.Map;
/**
* @Created by xzm on 2019/11/13.
* @Describe:创建ReturnFormat定义全局异常及方法供调用
* @Review by:
* @Modify by:
* @Version : $ v_1.0 on 2019/11/13
* @Remark:
*/
public class ResponseFormat {
private static Map<String,String> messageMap =new HashMap();
//初始化状态码与文字说明
static {
messageMap.put("400", "Bad Request!");
messageMap.put("401", "NotAuthorization");
messageMap.put("404", "Resource is not available");
messageMap.put("405", "Method Not Allowed");
messageMap.put("406", "Not Acceptable");
messageMap.put("500", "Internal Server Error");
}
//出现异常时调用
public static String retParam(int code) {
BaseResponse json = new BaseResponse(code, messageMap.get(String.valueOf(code)));
return json.toString();
}
//正常时调用
public static String retData(Object data){
BaseResponse json = new BaseResponse(200, "ok!");
json.setData(data);
return json.toString();
}
}
- 正常程序中对返回封装类的使用
package com.mobile.base;
import org.springframework.beans.ConversionNotSupportedException;
import org.springframework.beans.TypeMismatchException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @Created by xzm on 2019/11/14.
* @Describe:编写异常增强类RestExceptionHandler
* @Review by:
* @Modify by:
* @Version : $ v_1.0 on 2019/11/14
* @Remark:
*/
@ControllerAdvice
public class RestExceptionHandler {
//400错误
@ExceptionHandler({HttpMessageNotReadableException.class})
@ResponseBody
public String requestNotReadable(HttpMessageNotReadableException ex) {
System.out.println("400..requestNotReadable");
ex.printStackTrace();
return ResponseFormat.retParam(400);
}
//400错误
@ExceptionHandler({TypeMismatchException.class})
@ResponseBody
public String requestTypeMismatch(TypeMismatchException ex) {
System.out.println("400..TypeMismatchException");
ex.printStackTrace();
return ResponseFormat.retParam(400);
}
//400错误
@ExceptionHandler({MissingServletRequestParameterException.class})
@ResponseBody
public String requestMissingServletRequest(MissingServletRequestParameterException ex) {
System.out.println("400..MissingServletRequest");
ex.printStackTrace();
return ResponseFormat.retParam(400);
}
//405错误
@ExceptionHandler({HttpRequestMethodNotSupportedException.class})
@ResponseBody
public String request405() {
System.out.println("405...");
return ResponseFormat.retParam(405);
}
//406错误
@ExceptionHandler({HttpMediaTypeNotAcceptableException.class})
@ResponseBody
public String request406() {
System.out.println("404...");
return ResponseFormat.retParam(406);
}
//500错误
@ExceptionHandler({ConversionNotSupportedException.class, HttpMessageNotWritableException.class})
@ResponseBody
public String server500(RuntimeException runtimeException) {
System.out.println("500...");
return ResponseFormat.retParam(406);
}
}
对于全局异常的处理笔者也百度也很多,试过很多方法比如:@CrossOrigin注解等等,但都不好使。皇天不负有心人,终于在一篇springmvc 通过异常增强返回给客户端统一格式博客中找到了解决方法。这时我耳边响起了一句话:“问题一定会解决的,如果你还没有解决说明还没到最后”。不过还有一个小bug(返回异常为中文时会出现???的乱码。
补充:ssm前后端分离中对于404异常的捕获
在全局异常捕获中加入
/**
* me 404-NOT_FOUND
* @param e
* @return
*/
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseBody
public String handlerNotFoundException(NoHandlerFoundException e)
{
System.out.println("请求的资源不可用");
return ReturnFormat.retParam(404);
}
在web.xml–servlet中加入
<!--因为DispatcherServlet源码中对于throwExceptionIfNoHandlerFound 默认是 false 我们需要在初始化DispatcherServlet时将参数值更改为true.-->
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
跨域问题
在前后端分离过程必然会遇到跨域问题具体原因感兴趣的可以移步ajax中的json和jsonp详解浏览器的同源策略和跨域详解(内含故事解析这里我就不说这段离奇曲折的解决过去与故事了。话不多说直接上解决方法
1、实现Filter接口设置响应头
package com.hsy.sms.util;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
public class SimpleCORSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.addHeader("Access-Control-Allow-Origin", "*");
//httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,access_token,refresh_token");
httpResponse.setHeader("Access-Control-Allow-Methods", "GET, PUT, DELETE, POST");
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
httpResponse.setHeader("Access-Control-Max-Age", "0");
httpResponse.setContentType("text/html;charset=UTF-8");
httpResponse.setHeader("XDomainRequestAllowed","1");
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
2、在web.xml中加入自定义的过滤器
<!-- 跨域过滤 -->
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>com.hsy.sms.util.SimpleCORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>