mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-10-31 00:57:13 +08:00 
			
		
		
		
	refactor: 封装 Spring Boot 默认错误处理
1.排除路径配置放开 /error,以防止出现默认错误处理却显示为 401 的问题(例如:404 被识别为 401) 2.封装 Spring Boot 默认错误处理,统一响应结构
This commit is contained in:
		| @@ -0,0 +1,94 @@ | ||||
| /* | ||||
|  * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| package top.charles7c.cnadmin.common.handler; | ||||
|  | ||||
| import java.io.IOException; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
| import javax.servlet.http.HttpServletRequest; | ||||
| import javax.servlet.http.HttpServletResponse; | ||||
|  | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
|  | ||||
| import org.springframework.boot.autoconfigure.web.ServerProperties; | ||||
| import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController; | ||||
| import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver; | ||||
| import org.springframework.boot.web.servlet.error.ErrorAttributes; | ||||
| import org.springframework.http.HttpStatus; | ||||
| import org.springframework.http.MediaType; | ||||
| import org.springframework.http.ResponseEntity; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import org.springframework.web.servlet.ModelAndView; | ||||
|  | ||||
| import com.fasterxml.jackson.databind.ObjectMapper; | ||||
|  | ||||
| import cn.hutool.core.bean.BeanUtil; | ||||
| import cn.hutool.json.JSONUtil; | ||||
|  | ||||
| import top.charles7c.cnadmin.common.model.vo.R; | ||||
|  | ||||
| /** | ||||
|  * 全局错误处理器 | ||||
|  * | ||||
|  * @author Charles7c | ||||
|  * @since 2023/9/10 9:47 | ||||
|  */ | ||||
| @Slf4j | ||||
| @RestController | ||||
| public class GlobalErrorHandler extends BasicErrorController { | ||||
|  | ||||
|     @Resource | ||||
|     private ObjectMapper objectMapper; | ||||
|  | ||||
|     public GlobalErrorHandler(ErrorAttributes errorAttributes, ServerProperties serverProperties, | ||||
|         List<ErrorViewResolver> errorViewResolvers) { | ||||
|         super(errorAttributes, serverProperties.getError(), errorViewResolvers); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) { | ||||
|         Map<String, Object> errorAttributeMap = | ||||
|             super.getErrorAttributes(request, super.getErrorAttributeOptions(request, MediaType.TEXT_HTML)); | ||||
|         String path = (String)errorAttributeMap.get("path"); | ||||
|         HttpStatus status = super.getStatus(request); | ||||
|         R<Object> result = R.fail(status.value(), (String)errorAttributeMap.get("error")); | ||||
|         result.setData(path); | ||||
|         try { | ||||
|             response.setStatus(status.value()); | ||||
|             response.setContentType(MediaType.APPLICATION_JSON_VALUE); | ||||
|             objectMapper.writeValue(response.getWriter(), result); | ||||
|         } catch (IOException e) { | ||||
|             log.error("请求地址 [{}],发生 IO 异常。", path, e); | ||||
|         } | ||||
|         log.error("请求地址 [{}],发生异常,错误信息:{}。", path, JSONUtil.toJsonStr(errorAttributeMap)); | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) { | ||||
|         Map<String, Object> errorAttributeMap = | ||||
|             super.getErrorAttributes(request, super.getErrorAttributeOptions(request, MediaType.ALL)); | ||||
|         String path = (String)errorAttributeMap.get("path"); | ||||
|         HttpStatus status = super.getStatus(request); | ||||
|         R<Object> result = R.fail(status.value(), (String)errorAttributeMap.get("error")); | ||||
|         result.setData(path); | ||||
|         log.error("请求地址 [{}],发生异常,错误信息:{}。", path, JSONUtil.toJsonStr(errorAttributeMap)); | ||||
|         return new ResponseEntity<>(BeanUtil.beanToMap(result), status); | ||||
|     } | ||||
| } | ||||
| @@ -183,7 +183,7 @@ public class GlobalExceptionHandler { | ||||
|     @ExceptionHandler(HttpRequestMethodNotSupportedException.class) | ||||
|     public R handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, HttpServletRequest request) { | ||||
|         LogContextHolder.setErrorMsg(e.getMessage()); | ||||
|         log.error("请求地址 [{}],不支持 [{}] 请求", request.getRequestURI(), e.getMethod()); | ||||
|         log.error("请求地址 [{}],不支持 [{}] 请求。", request.getRequestURI(), e.getMethod()); | ||||
|         return R.fail(HttpStatus.METHOD_NOT_ALLOWED.value(), e.getMessage()); | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user