dashan
1 year ago
8 changed files with 401 additions and 3 deletions
@ -0,0 +1,43 @@ |
|||||||
|
package com.ds.commons.basemodel.exception; |
||||||
|
|
||||||
|
import com.ds.commons.basemodel.response.R; |
||||||
|
import lombok.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ds |
||||||
|
* @since 2023/8/30 |
||||||
|
*/ |
||||||
|
@EqualsAndHashCode(callSuper = true) |
||||||
|
@NoArgsConstructor |
||||||
|
@Data |
||||||
|
@AllArgsConstructor |
||||||
|
public class DsException extends RuntimeException{ |
||||||
|
|
||||||
|
//错误码
|
||||||
|
private Integer code; |
||||||
|
|
||||||
|
//错误信息
|
||||||
|
private String msg; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 使用R.MSG枚举定义的错误消息 |
||||||
|
* @param msg 错误消息 |
||||||
|
*/ |
||||||
|
public DsException(R.MSG msg) { |
||||||
|
super(msg.getMsg()); |
||||||
|
this.code=msg.getCode(); |
||||||
|
this.msg=msg.getMsg(); |
||||||
|
} |
||||||
|
|
||||||
|
public DsException append(String msg){ |
||||||
|
this.msg+=msg; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public DsException before(String msg){ |
||||||
|
this.msg=msg+this.msg; |
||||||
|
return this; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,38 @@ |
|||||||
|
package com.ds.commons.basemodel.response; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
|
||||||
|
import java.io.Serial; |
||||||
|
import java.io.Serializable; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Getter |
||||||
|
public class PageResult<T> implements Serializable { |
||||||
|
|
||||||
|
@Serial |
||||||
|
private static final long serialVersionUID = 1402394526521183854L; |
||||||
|
|
||||||
|
private final List<T> content; |
||||||
|
private long page; |
||||||
|
private long size; |
||||||
|
private final long total; |
||||||
|
private long totalPage; |
||||||
|
|
||||||
|
public PageResult(List<T> content, |
||||||
|
long page, |
||||||
|
long size, |
||||||
|
long total, |
||||||
|
long totalPage){ |
||||||
|
this.content=content; |
||||||
|
this.page=page; |
||||||
|
this.size=size; |
||||||
|
this.totalPage=totalPage; |
||||||
|
this.total=total; |
||||||
|
} |
||||||
|
|
||||||
|
public PageResult(List<T> content, |
||||||
|
long total){ |
||||||
|
this.content=content; |
||||||
|
this.total=total; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,166 @@ |
|||||||
|
package com.ds.commons.basemodel.response; |
||||||
|
|
||||||
|
import com.ds.commons.basemodel.exception.DsException; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.Getter; |
||||||
|
import lombok.NoArgsConstructor; |
||||||
|
import lombok.ToString; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* Response Tool |
||||||
|
* @author ds |
||||||
|
*/ |
||||||
|
@ToString |
||||||
|
@NoArgsConstructor |
||||||
|
@Data |
||||||
|
public class R<T> implements Serializable { |
||||||
|
|
||||||
|
@Getter |
||||||
|
public enum MSG { |
||||||
|
|
||||||
|
// 成功
|
||||||
|
SUCCESS(1, "SUCCESS"), |
||||||
|
|
||||||
|
// 失败
|
||||||
|
FAILURE(0, "FAILURE"), |
||||||
|
/* 参数错误 1000-1999 */ |
||||||
|
PARAM_VALIDATION_FAILURE(1000,"参数无效"), |
||||||
|
NOT_EXISTS_PARAM(1001,"参数不存在"), |
||||||
|
/* 用户错误 2000-2999 */ |
||||||
|
/* 接口异常 3000-3999 */ |
||||||
|
SQL_EXCEPTION(3000,"SQL异常") |
||||||
|
; |
||||||
|
|
||||||
|
|
||||||
|
final int code; |
||||||
|
final String msg; |
||||||
|
|
||||||
|
MSG(int code, String msg) { |
||||||
|
this.code = code; |
||||||
|
this.msg = msg; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private int code; |
||||||
|
private String msg; |
||||||
|
|
||||||
|
private T data; |
||||||
|
|
||||||
|
public R<T> setMsg(String msg) { |
||||||
|
this.msg = msg; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public R(MSG msg) { |
||||||
|
this.code = msg.code; |
||||||
|
this.msg = msg.msg; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 通过预设错误码和自定义错误信息创建 |
||||||
|
* |
||||||
|
* @param code 错误码 |
||||||
|
* @param msg 错误信息 |
||||||
|
*/ |
||||||
|
private R(int code, String msg) { |
||||||
|
this.code = code; |
||||||
|
this.msg = msg; |
||||||
|
} |
||||||
|
|
||||||
|
public R(T obj) { |
||||||
|
this.code = MSG.SUCCESS.code; |
||||||
|
this.msg = MSG.SUCCESS.msg; |
||||||
|
this.data = obj; |
||||||
|
} |
||||||
|
|
||||||
|
public R(MSG msg, T obj) { |
||||||
|
this.code = msg.code; |
||||||
|
this.msg = msg.msg; |
||||||
|
this.data = obj; |
||||||
|
} |
||||||
|
|
||||||
|
public R(int code, String msg, T obj) { |
||||||
|
this.code = code; |
||||||
|
this.msg = msg; |
||||||
|
this.data = obj; |
||||||
|
} |
||||||
|
|
||||||
|
public static R<Void> success() { |
||||||
|
return new R<>(MSG.SUCCESS); |
||||||
|
} |
||||||
|
|
||||||
|
public static <T> R<T> success(T obj) { |
||||||
|
return new R<>(MSG.SUCCESS, obj); |
||||||
|
} |
||||||
|
|
||||||
|
public static R<Void> success(int code, String msg) { |
||||||
|
return new R<>(code, msg); |
||||||
|
} |
||||||
|
|
||||||
|
public static <T> R<T> success(T obj,String msg) { |
||||||
|
return new R<>(MSG.SUCCESS.code,msg, obj); |
||||||
|
} |
||||||
|
public static <T> R<T> failure(T obj,String msg) { |
||||||
|
return new R<>(MSG.FAILURE.code,msg, obj); |
||||||
|
} |
||||||
|
|
||||||
|
public static R<Void> failure() { |
||||||
|
return new R<>(MSG.FAILURE); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static R<Void> failure(int code, String msg) { |
||||||
|
return new R<>(code, msg); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static R<Void> failure(MSG e) { |
||||||
|
return new R<>(e.getCode(), e.getMsg()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static R<Void> failure(DsException e) { |
||||||
|
return new R<>(e.getCode(), e.getMsg()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static <T> R<T> failure(T obj) { |
||||||
|
return new R<>(MSG.FAILURE, obj); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 分页信息 |
||||||
|
* |
||||||
|
* @param content 内容列表 |
||||||
|
* @param page 当前页数 |
||||||
|
* @param size 每页数据量 |
||||||
|
* @param total 数据总量 |
||||||
|
* @param totalPage 总页数 |
||||||
|
* @return res |
||||||
|
*/ |
||||||
|
public static <T> R<PageResult<T>> pageList(List<T> content, long page, long size, long total, long totalPage) { |
||||||
|
|
||||||
|
|
||||||
|
PageResult<T> pr = new PageResult<>(content, page, total, size, totalPage); |
||||||
|
|
||||||
|
return new R<>(MSG.SUCCESS, pr); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 分页信息 |
||||||
|
* |
||||||
|
* @param content 内容列表 |
||||||
|
* @param total 数据总量 |
||||||
|
* @return res |
||||||
|
*/ |
||||||
|
public static <T> R<PageResult<T>> simplePageList(List<T> content, long total) { |
||||||
|
|
||||||
|
PageResult<T> pr = new PageResult<>(content, total); |
||||||
|
|
||||||
|
return new R<>(MSG.SUCCESS, pr); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,134 @@ |
|||||||
|
package com.ds.commons.web.config.exection; |
||||||
|
|
||||||
|
import com.ds.commons.basemodel.exception.DsException; |
||||||
|
import com.ds.commons.basemodel.response.R; |
||||||
|
import jakarta.servlet.http.HttpServletRequest; |
||||||
|
import jakarta.validation.ConstraintViolationException; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.dao.DataAccessException; |
||||||
|
import org.springframework.http.HttpStatus; |
||||||
|
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.bind.annotation.ExceptionHandler; |
||||||
|
import org.springframework.web.bind.annotation.ResponseStatus; |
||||||
|
import org.springframework.web.bind.annotation.RestControllerAdvice; |
||||||
|
|
||||||
|
import java.sql.SQLException; |
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author dss |
||||||
|
* @since 2022/3/2 |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
@RestControllerAdvice |
||||||
|
public class WebGlobalExceptionHandler { |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 请求方法错误异常处理 |
||||||
|
* @param e 异常 |
||||||
|
* @param request 请求体 |
||||||
|
* @return 响应体 |
||||||
|
*/ |
||||||
|
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) |
||||||
|
@ExceptionHandler(HttpRequestMethodNotSupportedException.class) |
||||||
|
public R<Void> handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e, HttpServletRequest request) { |
||||||
|
log.error(request.getMethod()+"-"+request.getRequestURI() + ":不支持当前请求方法",e); |
||||||
|
return R.failure(HttpStatus.METHOD_NOT_ALLOWED.value(),"不支持当前请求方法"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* SQL异常处理 |
||||||
|
* @param e 异常 |
||||||
|
* @param request 请求体 |
||||||
|
* @return 响应体 |
||||||
|
*/ |
||||||
|
@ExceptionHandler(DataAccessException.class) |
||||||
|
public R<Void> dataAccessException(DataAccessException e,HttpServletRequest request){ |
||||||
|
log.error(request.getMethod()+"-"+request.getRequestURI()+":sql异常",e); |
||||||
|
SQLException sqlException=(SQLException) e.getCause(); |
||||||
|
return R.failure(sqlException.getErrorCode(),"SQL异常"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 找不到请求参数 |
||||||
|
*/ |
||||||
|
@ExceptionHandler(MissingServletRequestParameterException.class) |
||||||
|
public R<Void> handleMissingServletRequestParameterException(MissingServletRequestParameterException e,HttpServletRequest request){ |
||||||
|
log.error(request.getMethod()+"-"+request.getRequestURI()+":"+e.getParameterName()+"参数未找到",e); |
||||||
|
return R.failure(R.MSG.NOT_EXISTS_PARAM).setMsg(e.getParameterName()+"参数未找到"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* POST方法的参数效验异常处理器 |
||||||
|
* |
||||||
|
* @param e 参数验证异常 |
||||||
|
* @return ResponseInfo |
||||||
|
*/ |
||||||
|
@ExceptionHandler(MethodArgumentNotValidException.class) |
||||||
|
public R<Void> parameterExceptionHandler(MethodArgumentNotValidException e,HttpServletRequest request) { |
||||||
|
log.error(request.getMethod()+"-"+request.getRequestURI()+":参数验证失败",e); |
||||||
|
// 获取异常信息
|
||||||
|
BindingResult exceptions = e.getBindingResult(); |
||||||
|
// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
|
||||||
|
if (exceptions.hasErrors()) { |
||||||
|
List<ObjectError> errors = exceptions.getAllErrors(); |
||||||
|
if (!errors.isEmpty()) { |
||||||
|
// 这里列出了全部错误参数,按正常逻辑,只需要第一条错误即可
|
||||||
|
FieldError fieldError = (FieldError) errors.get(0); |
||||||
|
return R.failure(R.MSG.PARAM_VALIDATION_FAILURE).setMsg(fieldError.getDefaultMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
return R.failure(R.MSG.PARAM_VALIDATION_FAILURE); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 项目运行异常处理 |
||||||
|
* @param e 异常 |
||||||
|
* @param request 请求体 |
||||||
|
* @return 响应体 |
||||||
|
*/ |
||||||
|
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) |
||||||
|
@ExceptionHandler(Exception.class) |
||||||
|
public R<Void> handleException(Exception e, HttpServletRequest request) { |
||||||
|
log.error(request.getMethod()+"-"+request.getRequestURI() + ":服务运行异常",e); |
||||||
|
return R.failure(HttpStatus.INTERNAL_SERVER_ERROR.value(),"服务运行异常"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 参数验证未通过异常处理 |
||||||
|
* @param e 异常 |
||||||
|
* @param request 请求体 |
||||||
|
* @return 响应体 |
||||||
|
*/ |
||||||
|
@ExceptionHandler(ConstraintViolationException.class) |
||||||
|
public R<Void> parameterExceptionHandler(ConstraintViolationException e,HttpServletRequest request) { |
||||||
|
log.error(request.getMethod()+"-"+request.getRequestURI()+":参数无效",e); |
||||||
|
List<String> list= Arrays.asList(e.getMessage().split(",").clone()); |
||||||
|
if (!list.isEmpty()){ |
||||||
|
return R.failure(R.MSG.PARAM_VALIDATION_FAILURE).setMsg(list.get(0).substring(list.get(0).indexOf(":")+2)); |
||||||
|
} |
||||||
|
return R.failure(R.MSG.PARAM_VALIDATION_FAILURE); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 自定义异常处理 |
||||||
|
* @param e 异常 |
||||||
|
* @param request 请求体对象 |
||||||
|
* @return 响应体 |
||||||
|
*/ |
||||||
|
@ResponseStatus(HttpStatus.OK) |
||||||
|
@ExceptionHandler({DsException.class}) |
||||||
|
public R<Void> handleException(DsException e, HttpServletRequest request) { |
||||||
|
log.error(request.getMethod()+"-"+request.getRequestURI() + ":自定义内部异常",e); |
||||||
|
return R.failure(e); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue