¶Ô±ÈÐÂÎļþ |
| | |
| | | /* |
| | | * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. |
| | | * |
| | | * Redistribution and use in source and binary forms, with or without |
| | | * modification, are permitted provided that the following conditions are met: |
| | | * |
| | | * Redistributions of source code must retain the above copyright notice, |
| | | * this list of conditions and the following disclaimer. |
| | | * Redistributions in binary form must reproduce the above copyright |
| | | * notice, this list of conditions and the following disclaimer in the |
| | | * documentation and/or other materials provided with the distribution. |
| | | * Neither the name of the dreamlu.net developer nor the names of its |
| | | * contributors may be used to endorse or promote products derived from |
| | | * this software without specific prior written permission. |
| | | * Author: Chill åºéª (smallchill@163.com) |
| | | */ |
| | | package org.springblade.core.log.error; |
| | | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.hibernate.validator.internal.engine.path.PathImpl; |
| | | import org.springblade.core.tool.api.R; |
| | | import org.springblade.core.tool.api.ResultCode; |
| | | import org.springblade.core.tool.utils.StringUtil; |
| | | import org.springframework.boot.autoconfigure.AutoConfiguration; |
| | | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; |
| | | import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; |
| | | import org.springframework.core.Ordered; |
| | | import org.springframework.core.annotation.Order; |
| | | import org.springframework.http.HttpStatus; |
| | | import org.springframework.http.converter.HttpMessageNotReadableException; |
| | | import org.springframework.validation.BindException; |
| | | import org.springframework.validation.BindingResult; |
| | | import org.springframework.validation.FieldError; |
| | | import org.springframework.web.HttpMediaTypeNotAcceptableException; |
| | | import org.springframework.web.HttpMediaTypeNotSupportedException; |
| | | 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 org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; |
| | | import org.springframework.web.servlet.DispatcherServlet; |
| | | import org.springframework.web.servlet.NoHandlerFoundException; |
| | | |
| | | import javax.servlet.Servlet; |
| | | import javax.validation.ConstraintViolation; |
| | | import javax.validation.ConstraintViolationException; |
| | | import java.util.Set; |
| | | |
| | | /** |
| | | * å
¨å±å¼å¸¸å¤çï¼å¤çå¯é¢è§çå¼å¸¸ï¼Order æåºä¼å
çº§é« |
| | | * |
| | | * @author Chill |
| | | */ |
| | | @Slf4j |
| | | @Order(Ordered.HIGHEST_PRECEDENCE) |
| | | @AutoConfiguration |
| | | @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) |
| | | @ConditionalOnClass({ Servlet.class, DispatcherServlet.class }) |
| | | @RestControllerAdvice |
| | | public class RestExceptionTranslator { |
| | | |
| | | @ExceptionHandler(MissingServletRequestParameterException.class) |
| | | @ResponseStatus(HttpStatus.BAD_REQUEST) |
| | | public R handleError(MissingServletRequestParameterException e) { |
| | | log.warn("缺å°è¯·æ±åæ°", e.getMessage()); |
| | | String message = String.format("缺å°å¿
è¦ç请æ±åæ°: %s", e.getParameterName()); |
| | | return R.fail(ResultCode.PARAM_MISS, message); |
| | | } |
| | | |
| | | @ExceptionHandler(MethodArgumentTypeMismatchException.class) |
| | | @ResponseStatus(HttpStatus.BAD_REQUEST) |
| | | public R handleError(MethodArgumentTypeMismatchException e) { |
| | | log.warn("请æ±åæ°æ ¼å¼é误", e.getMessage()); |
| | | String message = String.format("请æ±åæ°æ ¼å¼é误: %s", e.getName()); |
| | | return R.fail(ResultCode.PARAM_TYPE_ERROR, message); |
| | | } |
| | | |
| | | @ExceptionHandler(MethodArgumentNotValidException.class) |
| | | @ResponseStatus(HttpStatus.BAD_REQUEST) |
| | | public R handleError(MethodArgumentNotValidException e) { |
| | | log.warn("åæ°éªè¯å¤±è´¥", e.getMessage()); |
| | | return handleError(e.getBindingResult()); |
| | | } |
| | | |
| | | @ExceptionHandler(BindException.class) |
| | | @ResponseStatus(HttpStatus.BAD_REQUEST) |
| | | public R handleError(BindException e) { |
| | | log.warn("åæ°ç»å®å¤±è´¥", e.getMessage()); |
| | | return handleError(e.getBindingResult()); |
| | | } |
| | | |
| | | private R handleError(BindingResult result) { |
| | | FieldError error = result.getFieldError(); |
| | | String message = String.format("%s:%s", error.getField(), error.getDefaultMessage()); |
| | | return R.fail(ResultCode.PARAM_BIND_ERROR, message); |
| | | } |
| | | |
| | | @ExceptionHandler(ConstraintViolationException.class) |
| | | @ResponseStatus(HttpStatus.BAD_REQUEST) |
| | | public R handleError(ConstraintViolationException e) { |
| | | log.warn("åæ°éªè¯å¤±è´¥", e.getMessage()); |
| | | Set<ConstraintViolation<?>> violations = e.getConstraintViolations(); |
| | | ConstraintViolation<?> violation = violations.iterator().next(); |
| | | String path = ((PathImpl) violation.getPropertyPath()).getLeafNode().getName(); |
| | | String message = String.format("%s:%s", path, violation.getMessage()); |
| | | return R.fail(ResultCode.PARAM_VALID_ERROR, message); |
| | | } |
| | | |
| | | @ExceptionHandler(NoHandlerFoundException.class) |
| | | @ResponseStatus(HttpStatus.NOT_FOUND) |
| | | public R handleError(NoHandlerFoundException e) { |
| | | log.error("404没æ¾å°è¯·æ±:{}", e.getMessage()); |
| | | return R.fail(ResultCode.NOT_FOUND, e.getMessage()); |
| | | } |
| | | |
| | | @ExceptionHandler(HttpMessageNotReadableException.class) |
| | | @ResponseStatus(HttpStatus.BAD_REQUEST) |
| | | public R handleError(HttpMessageNotReadableException e) { |
| | | log.error("æ¶æ¯ä¸è½è¯»å:{}", e.getMessage()); |
| | | return R.fail(ResultCode.MSG_NOT_READABLE, e.getMessage()); |
| | | } |
| | | |
| | | @ExceptionHandler(HttpRequestMethodNotSupportedException.class) |
| | | @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) |
| | | public R handleError(HttpRequestMethodNotSupportedException e) { |
| | | log.error("䏿¯æå½åè¯·æ±æ¹æ³:{}", e.getMessage()); |
| | | return R.fail(ResultCode.METHOD_NOT_SUPPORTED, e.getMessage()); |
| | | } |
| | | |
| | | @ExceptionHandler(HttpMediaTypeNotSupportedException.class) |
| | | @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE) |
| | | public R handleError(HttpMediaTypeNotSupportedException e) { |
| | | log.error("䏿¯æå½ååªä½ç±»å:{}", e.getMessage()); |
| | | return R.fail(ResultCode.MEDIA_TYPE_NOT_SUPPORTED, e.getMessage()); |
| | | } |
| | | |
| | | @ExceptionHandler(HttpMediaTypeNotAcceptableException.class) |
| | | @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE) |
| | | public R handleError(HttpMediaTypeNotAcceptableException e) { |
| | | String message = e.getMessage() + " " + StringUtil.join(e.getSupportedMediaTypes()); |
| | | log.error("䏿¥åçåªä½ç±»å:{}", message); |
| | | return R.fail(ResultCode.MEDIA_TYPE_NOT_SUPPORTED, message); |
| | | } |
| | | |
| | | } |