表数据导出支持

This commit is contained in:
暮光:城中城
2021-06-05 16:38:27 +08:00
parent 9e3f479b3e
commit 694f847f1d
17 changed files with 678 additions and 159 deletions

View File

@@ -3,112 +3,51 @@ package com.zyplayer.doc.manage.framework.exception;
import com.alibaba.fastjson.JSON;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 全局异常处理器
*/
@Component
public class GlobalHandlerExceptionResolver extends SimpleMappingExceptionResolver {
private static final Logger LOGGER = LoggerFactory.getLogger(GlobalHandlerExceptionResolver.class);
private static final Logger logger = LoggerFactory.getLogger(GlobalHandlerExceptionResolver.class);
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
LOGGER.error("---自定义异常处理---", ex);
request.setAttribute("throwable", ex);
ModelAndView mv = new ModelAndView();
response.setStatus(HttpStatus.OK.value());// 设置状态码
response.setContentType(MediaType.APPLICATION_JSON_VALUE);// 设置ContentType
response.setCharacterEncoding("UTF-8");// 避免乱码
response.setCharacterEncoding("UTF-8");
response.setStatus(HttpStatus.OK.value());
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setHeader("Cache-Control", "no-cache, must-revalidate");
DocResponseJson<Object> responseJson = null;
if (ex instanceof ConfirmException) {// 提示性异常
responseJson = DocResponseJson.warn(ex.getMessage());
} else {// 其他异常
DocResponseJson<Object> responseJson;
// 无需处理的异常
if (ex instanceof HttpMediaTypeNotAcceptableException) {
responseJson = DocResponseJson.warn("系统错误");
}
boolean isResponseBody = isResponseBody(handler);// 是否返回body
// 返回页面或者返回内容处理
if (!isResponseBody) {
mv.addObject("errJson", responseJson);
String customErrPage = (String) request.getAttribute("customErrPage");
// 有定义过错误页面的直接返回自定义的错误页面
if(StringUtils.isNotBlank(customErrPage)) {
mv.setViewName(customErrPage);
} else {// 否则返回默认的错误页面
mv.setViewName("/statics/common/500.html");
}
} else {
try {
String jsonStr = JSON.toJSONString(responseJson);
response.getWriter().write(jsonStr);
} catch (IOException e) {
e.printStackTrace();
// 其他异常
logger.error("---自定义异常处理---", ex);
if (ex instanceof ConfirmException) {
responseJson = DocResponseJson.warn(ex.getMessage());
} else {
responseJson = DocResponseJson.warn("系统错误");
}
}
return mv;
}
/**
* 如果是HttpMessageNotReadableException 则获取错误字段
* @param exception
* @return
*/
public static String getExceptionField(String exception) {
Pattern pattern = Pattern.compile("Unrecognized field \"(\\w*)[$\"]");
Matcher matcher = pattern.matcher(exception);
String field = "";
if (matcher.find()) {
field = matcher.group(1);
} else {
pattern = Pattern.compile("Field error in object '.+' on field '(\\w+)'");
matcher = pattern.matcher(exception);
if (matcher.find()) {
field = matcher.group(1);
}
try {
String jsonStr = JSON.toJSONString(responseJson);
response.getWriter().write(jsonStr);
} catch (Exception e) {
logger.warn("write error" + e.getMessage());
}
return field;
return new ModelAndView();
}
/**
* 是否返回body
* @author
* @since 2017年5月11日
* @param handler
* @return
*/
private boolean isResponseBody(Object handler){
if (handler instanceof HandlerMethod) {
HandlerMethod mathod = (HandlerMethod) handler;
ResponseBody body = mathod.getMethodAnnotation(ResponseBody.class);
if(body == null){
RestController restController = mathod.getMethod().getDeclaringClass().getAnnotation(RestController.class);
if(restController == null){
if(!mathod.getMethod().getReturnType().isAssignableFrom(ResponseJson.class)){
return false;
}
}
}
}
return true;
}
}