springboot web 全局異常@RestControllerAdvice

时光总嘲笑我的痴心妄想 提交于 2019-12-20 15:17:28

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

1.WebControllerAdvice 


import static org.springframework.http.HttpStatus.BAD_REQUEST;
import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
import static org.springframework.http.HttpStatus.NOT_FOUND;
import static org.springframework.http.HttpStatus.UNAUTHORIZED;
import static org.springframework.http.HttpStatus.valueOf;

import java.util.stream.Collectors;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.ValidationException;

import com.demo.exceptions.HeaderValidationException;
import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.HttpMediaTypeNotSupportedException;
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 com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import feign.FeignException;

@Slf4j
@RestControllerAdvice("com.demo")
public class WebControllerAdvice {

    private static final String ERROR_FIELD = "error";

    @Autowired
    protected ObjectMapper objectMapper;

	  @Autowired
	  public WebControllerAdvice(ObjectMapper objectMapper) {
	    this.objectMapper = objectMapper;
	  }

    private static final String SOMETHING_WENT_WRONG_MSG = "Sorry, something went wrong. Please contact your local HSBC Bank";
    private static final String UNAUTHORIZED_MSG = "Unauthorized";
    private static final String CUSTOMER_NOT_FOUND_MSG = "Customer Not Found";
    private static final String METHOD_NOT_ALLOWED = "Method Not Allowed";
    private static final String ERROR_TEMPLATE = "ERROR: type={} statuscode={} cause={} message={}";


    // Thrown by feign and assessed
    @ExceptionHandler(feign.FeignException.class)
    public ResponseEntity<JsonNode> handleFeignException(final FeignException ex) {
        log.error(ERROR_TEMPLATE, ex.getClass().getName(), ex.status(), ex.getCause(), ex.getMessage());

		switch (ex.status()) {
		case 404:
			return new ResponseEntity<JsonNode>(msg(CUSTOMER_NOT_FOUND_MSG), NOT_FOUND);
		case 403:
			return new ResponseEntity<JsonNode>(msg(UNAUTHORIZED_MSG), UNAUTHORIZED);
		case 405:
			return new ResponseEntity<JsonNode>(msg(METHOD_NOT_ALLOWED), HttpStatus.METHOD_NOT_ALLOWED);
		default:
            return new ResponseEntity<JsonNode>(msg(SOMETHING_WENT_WRONG_MSG), ex.status() == 0 ? HttpStatus.INTERNAL_SERVER_ERROR
                : valueOf(ex.status()));
		}
	}


    @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
    public ResponseEntity<JsonNode> handleHttpMediaTypeNotSupportedException(final ValidationException ex) {
        log.error(ERROR_TEMPLATE, ex.getClass().getName(), HttpStatus.BAD_REQUEST, ex.getCause(),
            ex.getMessage());
        return new ResponseEntity<JsonNode>(msg(SOMETHING_WENT_WRONG_MSG), valueOf(BAD_REQUEST.name()));
    }

    @ExceptionHandler(ValidationException.class)
    public ResponseEntity<JsonNode> handleValidationException(final ValidationException ex) {
        log.error(ERROR_TEMPLATE, ex.getClass().getName(), HttpStatus.BAD_REQUEST, ex.getCause(),
            ex.getMessage());
        return new ResponseEntity<JsonNode>(msg(SOMETHING_WENT_WRONG_MSG), valueOf(BAD_REQUEST.name()));
    }

    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<JsonNode> handleConstraintViolationException(final ConstraintViolationException ex) {
        log.error(ERROR_TEMPLATE, ex.getClass().getName(), HttpStatus.BAD_REQUEST, ex.getCause(), ex
            .getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining()));
        return new ResponseEntity<JsonNode>(msg(SOMETHING_WENT_WRONG_MSG), valueOf(BAD_REQUEST.name()));
    }


    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<JsonNode> handleMethodArgumentNotValidException(final MethodArgumentNotValidException ex) {
        log.error(ERROR_TEMPLATE, ex.getClass().getName(), BAD_REQUEST, ex.getCause(), ex.getMessage());
        return new ResponseEntity<JsonNode>(msg(SOMETHING_WENT_WRONG_MSG), BAD_REQUEST);
    }

    @ExceptionHandler(HttpMessageNotReadableException.class)
    public ResponseEntity<JsonNode> handleHttpMessageNotReadableException(final HttpMessageNotReadableException ex) {
        log.error(ERROR_TEMPLATE, ex.getClass().getName(), BAD_REQUEST, ex.getCause(), ex.getMessage());
        return new ResponseEntity<JsonNode>(msg(SOMETHING_WENT_WRONG_MSG), BAD_REQUEST);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<JsonNode> handleBusinessException(final Exception ex) {
        log.error(ERROR_TEMPLATE, ex.getClass().getName(), ex.getCause(), ex.getMessage());
        return new ResponseEntity<JsonNode>(msg(SOMETHING_WENT_WRONG_MSG), INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public ResponseEntity<JsonNode> handleHttpRequestMethodNotSupportedException(final HttpRequestMethodNotSupportedException ex) {
        log.error(ERROR_TEMPLATE, ex.getClass().getName(), ex.getCause(), ex.getMessage());
        return new ResponseEntity<JsonNode>(msg(METHOD_NOT_ALLOWED), BAD_REQUEST);
    }

    @ExceptionHandler(HeaderValidationException.class)
    public ResponseEntity<JsonNode> handleHeaderValidationException(final HeaderValidationException headerValidationException) {
        log.error(ERROR_TEMPLATE, headerValidationException.getClass().getName(),
            headerValidationException.getCause(), headerValidationException.getMessage());
        return new ResponseEntity<JsonNode>(msg(headerValidationException.getMessage()), HttpStatus.BAD_REQUEST);
    }

    private JsonNode msg(final String errorMessage) {
        return this.objectMapper.createObjectNode().put(ERROR_FIELD, errorMessage);
    }
}

2.自定義異常類

HeaderValidationException
import lombok.Data;

@Data
public class HeaderValidationException extends RuntimeException {

    public HeaderValidationException(final String message) {
        super(message);
    }

    public HeaderValidationException(final String message, final Throwable cause) {
        super(message, cause);
    }

    public HeaderValidationException(final Throwable cause) {
        super(cause);
    }
}

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!