状态码:code 状态信息:status 返回信息:message 数据:data2.统一封装结果包含如下方法
全参数方法 成功返回(无参) 成功返回(枚举) 成功返回(状态码+返回信息) 成功返回(返回信息 + 数据) 成功返回(状态码+返回信息+数据) 成功返回(数据) 成功返回(返回信息) 失败返回(无参) 失败返回(枚举) 失败返回(状态码+返回信息) 失败返回(返回信息+数据) 失败返回(状态码+返回信息+数据) 失败返回(数据) 失败返回(返回信息)3.ResponseResult封装返回结果代码
package net.javadog.common.result; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import net.javadog.common.enums.HttpStatusEnum; /** * 返回结果集 * * @author javadog **/ @Data @AllArgsConstructor @NoArgsConstructor @ApiModel("统一结果集处理器") public class ResponseResult<T> { /** * 状态码 */ @ApiModelProperty(value = "状态码") private Integer code; /** * 状态信息 */ @ApiModelProperty(value = "状态信息") private Boolean status; /** * 返回信息 */ @ApiModelProperty(value = "返回信息") private String message; /** * 数据 */ @ApiModelProperty(value = "数据") private T data; /** * 全参数方法 * * @param code 状态码 * @param status 状态 * @param message 返回信息 * @param data 返回数据 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ private static <T> ResponseResult<T> response(Integer code, Boolean status, String message, T data) { ResponseResult<T> responseResult = new ResponseResult<>(); responseResult.setCode(code); responseResult.setStatus(status); responseResult.setMessage(message); responseResult.setData(data); return responseResult; } /** * 全参数方法 * * @param code 状态码 * @param status 状态 * @param message 返回信息 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ private static <T> ResponseResult<T> response(Integer code, Boolean status, String message) { ResponseResult<T> responseResult = new ResponseResult<>(); responseResult.setCode(code); responseResult.setStatus(status); responseResult.setMessage(message); return responseResult; } /** * 成功返回(无参) * * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> success() { return response(HttpStatusEnum.SUCCESS.getCode(), true, HttpStatusEnum.SUCCESS.getMessage(), null); } /** * 成功返回(枚举参数) * * @param httpResponseEnum 枚举参数 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> success(HttpStatusEnum httpResponseEnum) { return response(httpResponseEnum.getCode(), true, httpResponseEnum.getMessage()); } /** * 成功返回(状态码+返回信息) * * @param code 状态码 * @param message 返回信息 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> success(Integer code, String message) { return response(code, true, message); } /** * 成功返回(返回信息 + 数据) * * @param message 返回信息 * @param data 数据 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> success(String message, T data) { return response(HttpStatusEnum.SUCCESS.getCode(), true, message, data); } /** * 成功返回(状态码+返回信息+数据) * * @param code 状态码 * @param message 返回信息 * @param data 数据 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> success(Integer code, String message, T data) { return response(code, true, message, data); } /** * 成功返回(数据) * * @param data 数据 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> success(T data) { return response(HttpStatusEnum.SUCCESS.getCode(), true, HttpStatusEnum.SUCCESS.getMessage(), data); } /** * 成功返回(返回信息) * * @param message 返回信息 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> success(String message) { return response(HttpStatusEnum.SUCCESS.getCode(), true, message, null); } /** * 失败返回(无参) * * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> fail() { return response(HttpStatusEnum.ERROR.getCode(), false, HttpStatusEnum.ERROR.getMessage(), null); } /** * 失败返回(枚举) * * @param httpResponseEnum 枚举 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> fail(HttpStatusEnum httpResponseEnum) { return response(httpResponseEnum.getCode(), false, httpResponseEnum.getMessage()); } /** * 失败返回(状态码+返回信息) * * @param code 状态码 * @param message 返回信息 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> fail(Integer code, String message) { return response(code, false, message); } /** * 失败返回(返回信息+数据) * * @param message 返回信息 * @param data 数据 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> fail(String message, T data) { return response(HttpStatusEnum.ERROR.getCode(), false, message, data); } /** * 失败返回(状态码+返回信息+数据) * * @param code 状态码 * @param message 返回消息 * @param data 数据 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> fail(Integer code, String message, T data) { return response(code, false, message, data); } /** * 失败返回(数据) * * @param data 数据 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> fail(T data) { return response(HttpStatusEnum.ERROR.getCode(), false, HttpStatusEnum.ERROR.getMessage(), data); } /** * 失败返回(返回信息) * * @param message 返回信息 * @param <T> 泛型 * @return {@link ResponseResult<T>} */ public static <T> ResponseResult<T> fail(String message) { return response(HttpStatusEnum.ERROR.getCode(), false, message, null); } }4.HttpStatusEnum返回结果代码
package net.javadog.common.enums; import lombok.Getter; /** * Http状态返回枚举 * * @author javadog **/ @Getter public enum HttpStatusEnum { /** * 操作成功 */ SUCCESS(200, "操作成功"), /** * 对象创建成功 */ CREATED(201, "对象创建成功"), /** * 请求已经被接受 */ ACCEPTED(202, "请求已经被接受"), /** * 操作已经执行成功,但是没有返回数据 */ NO_CONTENT(204, "操作已经执行成功,但是没有返回数据"), /** * 资源已被移除 */ MOVED_PERM(301, "资源已被移除"), /** * 重定向 */ SEE_OTHER(303, "重定向"), /** * 资源没有被修改 */ NOT_MODIFIED(304, "资源没有被修改"), /** * 参数列表错误(缺少,格式不匹配) */ BAD_REQUEST(400, "参数列表错误(缺少,格式不匹配)"), /** * 未授权 */ UNAUTHORIZED(401, "未授权"), /** * 访问受限,授权过期 */ FORBIDDEN(403, "访问受限,授权过期"), /** * 资源,服务未找到 */ NOT_FOUND(404, "资源,服务未找!"), /** * 不允许的http方法 */ BAD_METHOD(405, "不允许的http方法"), /** * 资源冲突,或者资源被锁 */ CONFLICT(409, "资源冲突,或者资源被锁"), /** * 不支持的数据,媒体类型 */ UNSUPPORTED_TYPE(415, "不支持的数据,媒体类型"), /** * 系统内部错误 */ ERROR(500, "系统内部错误"), /** * 接口未实现 */ NOT_IMPLEMENTED(501, "接口未实现"), /** * 系统警告消息 */ WARN(601,"系统警告消息"); private final Integer code; private final String message; HttpStatusEnum(Integer code, String message) { this.code = code; this.message = message; } }5.SysLoginController实操调试
/** * 登录验证 * * 堆代码 duidaima.com */ @RestController public class SysLoginController { @Resource private SysLoginService loginService; /** * 登录方法 * * @param loginRequest 登录信息 * @return 结果 */ @PostMapping("/login") public ResponseResult login(@RequestBody LoginRequest loginRequest) { // 生成令牌 String token = loginService.login(loginRequest.getUsername(), loginRequest.getPassword()); return ResponseResult.success(token); } }🍋二.配置全局异常处理
2.@ExceptionHandler常用异常拦截
权限校验异常:AccessDeniedException(spring-security中异常)package net.javadog.common.exception; import cn.hutool.core.util.ObjectUtil; import net.javadog.common.enums.HttpStatusEnum; import net.javadog.common.result.ResponseResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.access.AccessDeniedException; import org.springframework.validation.BindException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; /** * 异常处理 配置 * * @author javadog */ @RestControllerAdvice public class GlobalException { private static final Logger log = LoggerFactory.getLogger(GlobalException.class); /** * 权限校验异常 */ @ExceptionHandler(AccessDeniedException.class) public ResponseResult handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',权限校验失败'{}'", requestURI, e.getMessage()); return ResponseResult.fail(HttpStatusEnum.FORBIDDEN.getCode(), HttpStatusEnum.FORBIDDEN.getMessage()); } /** * 请求方式不支持 */ @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public ResponseResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); return ResponseResult.fail(e.getMessage()); } /** * 业务异常 */ @ExceptionHandler(ServiceException.class) public ResponseResult handleServiceException(ServiceException e) { log.error(e.getMessage(), e); Integer code = e.getCode(); return ObjectUtil.isNotNull(code) ? ResponseResult.fail(code, e.getMessage()) : ResponseResult.fail(e.getMessage()); } /** * 拦截未知的运行时异常 */ @ExceptionHandler(RuntimeException.class) public ResponseResult handleRuntimeException(RuntimeException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',发生未知异常.", requestURI, e); return ResponseResult.fail(e.getMessage()); } /** * 系统异常 */ @ExceptionHandler(Exception.class) public ResponseResult handleException(Exception e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',发生系统异常.", requestURI, e); return ResponseResult.fail(e.getMessage()); } /** * 自定义验证异常 */ @ExceptionHandler(BindException.class) public ResponseResult handleBindException(BindException e) { log.error(e.getMessage(), e); String message = e.getAllErrors().get(0).getDefaultMessage(); return ResponseResult.fail(message); } /** * 自定义验证异常 */ @ExceptionHandler(MethodArgumentNotValidException.class) public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { log.error(e.getMessage(), e); String message = e.getBindingResult().getFieldError().getDefaultMessage(); return ResponseResult.fail(message); } }4.全局异常处理实操调试