1、分页数据封装类
import com.github.pagehelper.PageInfo;
import com.scm.boss.common.utils.BeanUtils;
import org.springframework.data.domain.Page;
import java.util.List;
/**
* 分页数据封装类
* @date 2023/10/19 9:34
* @author luohao
*/
public class CommonPage<T> {
private Integer pageNum;
private Integer pageSize;
private Integer totalPage;
private Long total;
private List<T> list;
/**
* 将PageHelper分页后的list转为分页信息
*/
public static <T> CommonPage<T> restPage(List<T> list) {
CommonPage<T> result = new CommonPage<T>();
PageInfo<T> pageInfo = new PageInfo<T>(list);
result.setTotalPage(pageInfo.getPages());
result.setPageNum(pageInfo.getPageNum());
result.setPageSize(pageInfo.getPageSize());
result.setTotal(pageInfo.getTotal());
result.setList(pageInfo.getList());
return result;
}
/**
* 将SpringData分页后的list转为分页信息
*/
public static <T> CommonPage<T> restPage(Page<T> pageInfo) {
CommonPage<T> result = new CommonPage<T>();
result.setTotalPage(pageInfo.getTotalPages());
result.setPageNum(pageInfo.getNumber());
result.setPageSize(pageInfo.getSize());
result.setTotal(pageInfo.getTotalElements());
result.setList(pageInfo.getContent());
return result;
}
/**
* 分页并转换输出
* @param list
* @param toType
* @param <T1>
* @param <T2>
* @return
*/
public static <T1,T2> CommonPage<T2> restPage(List<T1> list,Class<T2> toType) {
CommonPage<T2> result = new CommonPage<T2>();
PageInfo<T1> pageInfo = new PageInfo<T1>(list);
List<T2> convert = BeanUtils.convert(pageInfo.getList(), toType);
result.setTotalPage(pageInfo.getPages());
result.setPageNum(pageInfo.getPageNum());
result.setPageSize(pageInfo.getPageSize());
result.setTotal(pageInfo.getTotal());
result.setList(convert);
return result;
}
/**
* 分页并转换输出
* @param list
* @param total
* @param pageSize
* @param pageNum
* @param <T1>
* @return
*/
public static <T1> CommonPage<T1> restPage(List<T1> list, Long total, int pageNum, int pageSize) {
CommonPage<T1> result = new CommonPage<>();
Integer totalPage = total.intValue() / pageSize;
result.setTotalPage(total % pageSize == 0 ? totalPage : totalPage + 1);
result.setPageNum(pageNum);
result.setPageSize(pageSize);
result.setTotal(total);
result.setList(list);
return result;
}
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getTotalPage() {
return totalPage;
}
public void setTotalPage(Integer totalPage) {
this.totalPage = totalPage;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public Long getTotal() {
return total;
}
public void setTotal(Long total) {
this.total = total;
}
}
2、通用返回对象
/**
* 通用返回对象
* @date 2023/10/19 9:36
* @author luohao
*/
public class CommonResult<T> {
private long code;
private String message;
private T data;
private long timestamp = System.currentTimeMillis();
protected CommonResult() {
}
protected CommonResult(long code, String message) {
this.code = code;
this.message = message;
}
protected CommonResult(long code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
protected CommonResult(T data) {
this.code = ResultCodeEnum.SUCCESS.getCode();
this.message = ResultCodeEnum.SUCCESS.getMessage();
this.data = data;
}
/**
* 成功返回结果
*
*/
public static <T> CommonResult<T> success() {
return new CommonResult<T>(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage());
}
/**
* 成功返回结果
*
* @param data 获取的数据
*/
public static <T> CommonResult<T> success(T data) {
return new CommonResult<T>(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), data);
}
/**
* 成功返回结果
*
* @param data 获取的数据
* @param message 提示信息
*/
public static <T> CommonResult<T> success(T data, String message) {
return new CommonResult<T>(ResultCodeEnum.SUCCESS.getCode(), message, data);
}
/**
* 失败返回结果
* @param errorCode 错误码
*/
public static <T> CommonResult<T> failed(IErrorCode errorCode) {
return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null);
}
/**
* 失败返回结果
* @param errorCode 错误码
* @param message 错误信息
*/
public static <T> CommonResult<T> failed(IErrorCode errorCode, String message) {
return new CommonResult<T>(errorCode.getCode(), message, null);
}
/**
* 失败返回结果
* @param message 提示信息
*/
public static <T> CommonResult<T> failed(String message) {
return new CommonResult<T>(ResultCodeEnum.FAILED.getCode(), message, null);
}
/**
* 失败返回结果
* @param code 编码
* @param message 提示信息
* @param <T>
* @return
*/
public static <T> CommonResult<T> failed(int code, String message) {
return new CommonResult<T>(code, message, null);
}
/**
* 失败返回结果
*/
public static <T> CommonResult<T> failed() {
return failed(ResultCodeEnum.FAILED);
}
/**
* 参数验证失败返回结果
*/
public static <T> CommonResult<T> validateFailed() {
return failed(ResultCodeEnum.VALIDATE_FAILED);
}
/**
* 参数验证失败返回结果
* @param message 提示信息
*/
public static <T> CommonResult<T> validateFailed(String message) {
return new CommonResult<T>(ResultCodeEnum.VALIDATE_FAILED.getCode(), message, null);
}
/**
* 未登录返回结果
*/
public static <T> CommonResult<T> unauthorized(T data) {
return new CommonResult<T>(ResultCodeEnum.UNAUTHORIZED.getCode(), ResultCodeEnum.UNAUTHORIZED.getMessage(), data);
}
/**
* 未授权返回结果
*/
public static <T> CommonResult<T> forbidden(T data) {
return new CommonResult<T>(ResultCodeEnum.FORBIDDEN.getCode(), ResultCodeEnum.FORBIDDEN.getMessage(), data);
}
public long getCode() {
return code;
}
public void setCode(long code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
3、封装API的错误码接口
/**
* 封装API的错误码
* @date 2023/10/19 9:37
* @author luohao
*/
public interface IErrorCode {
long getCode();
String getMessage();
}
4、自定义API异常类
import com.scm.boss.common.api.IErrorCode;
/**
* 自定义API异常类
* @date 2023/10/19 9:38
* @author luohao
*/
public class ApiException extends RuntimeException {
private IErrorCode errorCode;
public ApiException(IErrorCode errorCode) {
super(errorCode.getMessage());
this.errorCode = errorCode;
}
public ApiException(String message) {
super(message);
}
public ApiException(IErrorCode errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
public ApiException(Throwable cause) {
super(cause);
}
public ApiException(String message, Throwable cause) {
super(message, cause);
}
public IErrorCode getErrorCode() {
return errorCode;
}
}
5、全局异常拦截处理类
import com.scm.boss.common.api.CommonResult;
import com.scm.boss.common.constants.ResultCodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 全局异常拦截处理
* @date 2023/10/19 9:45
* @author luohao
*/
@Slf4j
@Component
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 自定义异常拦截
* @param e
* @return
*/
@ExceptionHandler(value = ApiException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST) //自定义返回HTTP状态码
public CommonResult handle(ApiException e) {
if(e.getErrorCode() != null && e.getMessage() != null){
return CommonResult.failed(e.getErrorCode(), e.getMessage());
}
if (e.getErrorCode() != null) {
return CommonResult.failed(e.getErrorCode());
}
return CommonResult.failed(e.getMessage());
}
/**
* 捕获Validation异常
* @param e
* @return
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public CommonResult handle(MethodArgumentNotValidException e) {
List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
String message = allErrors.stream().map(s -> s.getDefaultMessage()).collect(Collectors.joining("、"));
return CommonResult.failed(message);
}
/**
* 全局异常拦截
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
public CommonResult handle(Exception e) {
log.error("程序出现异常:{}", e);
return CommonResult.failed(ResultCodeEnum.FAILED.getMessage());
}
}
6、枚举了一些常用API操作码
import com.scm.boss.common.api.IErrorCode;
/**
* 枚举了一些常用API操作码
* @author chenrui
*/
public enum ResultCodeEnum implements IErrorCode {
SUCCESS(200, "操作成功"),
FAILED(500, "操作失败"),
NOT_FOUND_SERVICE(501, "未找到服务器"),
SERVICE_INTERNAL_ERROR(502, "服务器内部错误"),
UNAUTHORIZED(401, "登录信息已过期,请重新登录!"),
FORBIDDEN(403, "没有相关权限"),
VALIDATE_FAILED(406, "参数检验失败"),
;
private long code;
private String message;
ResultCodeEnum(long code, String message) {
this.code = code;
this.message = message;
}
@Override
public long getCode() {
return code;
}
@Override
public String getMessage() {
return message;
}
}