You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
6.2 KiB

9 months ago
package com.alibaba.easytools.spring.exception.convertor;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import com.alibaba.easytools.base.constant.SymbolConstant;
import com.alibaba.easytools.base.excption.BusinessException;
import com.alibaba.easytools.base.wrapper.result.ActionResult;
import com.google.common.collect.Maps;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
/**
* 转换工具类
*
* @author 是仪
*/
public class ExceptionConvertorUtils {
/**
* 所有的异常处理转换器
*/
public static final Map<Class<?>, ExceptionConvertor> EXCEPTION_CONVERTOR_MAP = Maps.newHashMap();
static {
EXCEPTION_CONVERTOR_MAP.put(MethodArgumentNotValidException.class,
new MethodArgumentNotValidExceptionConvertor());
EXCEPTION_CONVERTOR_MAP.put(BindException.class, new BindExceptionConvertor());
EXCEPTION_CONVERTOR_MAP.put(BusinessException.class, new BusinessExceptionConvertor());
EXCEPTION_CONVERTOR_MAP.put(MissingServletRequestParameterException.class, new ParamExceptionConvertor());
EXCEPTION_CONVERTOR_MAP.put(IllegalArgumentException.class, new ParamExceptionConvertor());
EXCEPTION_CONVERTOR_MAP.put(MethodArgumentTypeMismatchException.class,
new MethodArgumentTypeMismatchExceptionConvertor());
EXCEPTION_CONVERTOR_MAP.put(MaxUploadSizeExceededException.class,
new MaxUploadSizeExceededExceptionConvertor());
EXCEPTION_CONVERTOR_MAP.put(HttpRequestMethodNotSupportedException.class, new BusinessExceptionConvertor());
EXCEPTION_CONVERTOR_MAP.put(ConstraintViolationException.class, new ConstraintViolationExceptionConvertor());
EXCEPTION_CONVERTOR_MAP.put(HttpMessageNotReadableException.class,
new ParamExceptionConvertor());
}
/**
* 默认转换器
*/
public static ExceptionConvertor DEFAULT_EXCEPTION_CONVERTOR = new DefaultExceptionConvertor();
/**
* 提取ConstraintViolationException中的错误消息
*
* @param e
* @return
*/
public static String buildMessage(ConstraintViolationException e) {
if (e == null || CollectionUtils.isEmpty(e.getConstraintViolations())) {
return null;
}
int index = 1;
StringBuilder msg = new StringBuilder();
msg.append("请检查以下信息:");
for (ConstraintViolation<?> constraintViolation : e.getConstraintViolations()) {
msg.append(index++);
// 得到错误消息
msg.append(SymbolConstant.DOT);
msg.append(" 字段(");
msg.append(constraintViolation.getPropertyPath());
msg.append(")传入的值为:\"");
msg.append(constraintViolation.getInvalidValue());
msg.append("\",校验失败,原因是:");
msg.append(constraintViolation.getMessage());
msg.append(SymbolConstant.SEMICOLON);
}
return msg.toString();
}
/**
* 提取BindingResult中的错误消息
*
* @param result
* @return
*/
public static String buildMessage(BindingResult result) {
List<ObjectError> errors = result.getAllErrors();
if (CollectionUtils.isEmpty(errors)) {
return null;
}
int index = 1;
StringBuilder msg = new StringBuilder();
msg.append("请检查以下信息:");
for (ObjectError e : errors) {
msg.append(index++);
// 得到错误消息
msg.append(SymbolConstant.DOT);
msg.append(" ");
msg.append("字段(");
msg.append(e.getObjectName());
if (e instanceof FieldError) {
FieldError fieldError = (FieldError)e;
msg.append(SymbolConstant.DOT);
msg.append(fieldError.getField());
}
msg.append(")");
if (e instanceof FieldError) {
FieldError fieldError = (FieldError)e;
msg.append("传入的值为:\"");
msg.append(fieldError.getRejectedValue());
msg.append("\",");
}
msg.append("校验失败,原因是:");
msg.append(e.getDefaultMessage());
msg.append(SymbolConstant.SEMICOLON);
}
return msg.toString();
}
/**
* 拼接头的日志信息
*
* @param request
* @return
*/
public static String buildHeaderString(HttpServletRequest request) {
StringBuilder stringBuilder = new StringBuilder();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headName = headerNames.nextElement();
stringBuilder.append(headName);
stringBuilder.append(SymbolConstant.COLON);
stringBuilder.append(request.getHeader(headName));
stringBuilder.append(SymbolConstant.COMMA);
}
return stringBuilder.toString();
}
/**
* 转换结果
*
* @param exception
* @return
*/
public static ActionResult convert(Throwable exception) {
ExceptionConvertor exceptionConvertor = EXCEPTION_CONVERTOR_MAP.get(exception.getClass());
if (exceptionConvertor == null) {
exceptionConvertor = DEFAULT_EXCEPTION_CONVERTOR;
}
return exceptionConvertor.convert(exception);
}
}