본문 바로가기

Backend/Spring | SpringBoot

[Spring] 예외처리(Exception Handler)(2)

반응형

java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens

HTTPS가 아니라 HTTP프로토콜인데 HTTPS로 요청해서 에러 발생한것
Swagger에서 자동으로 HTTPS하는것을 풀거나 특정 Controller의 URL 프로토콜을 HTTP로 하는 방법을 찾아야 할것 같다.

 

예외처리

참고 블로그 : https://hyunminh.github.io/exception-handling/

 

Spring에서 예외 핸들링하기

도입

hyunminh.github.io

 

package ncdc.cancermonitor.cmmn.exception;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;

public class ErrorResponse {
	// Response에서 Code부분
    private String code;
    // Response에서 Message부분
    private String message;
    // Response에서 Status부분
    private int status;
    // 커스텀한 에러 관련 세부 항목
    private List<CustomFieldError> errors;

    public static class CustomFieldError{
    	// 위치
        private String field;
        // 값
        private String value;
        // 원인
        private String reason;

        private CustomFieldError(String field, String value, String reason) {
            this.field = field;
            this.value = value;
            this.reason = reason;
        }

        private CustomFieldError(FieldError fieldError){
            this.field = fieldError.getField();
            this.value = fieldError.getRejectedValue().toString();
            this.reason = fieldError.getDefaultMessage();
        }

        public String getField() { return field; }
        public String getValue() { return value; }
        public String getReason() { return reason; }
    }
	
    // 전달받은 에러 Set으로 넘겨받기
    private void setErrorCode(ErrorCode errorCode){
        this.code = errorCode.getCode();
        this.message = errorCode.getMessage();
        this.status = errorCode.getStatus();
    }

    private ErrorResponse(ErrorCode errorCode, List<FieldError> errors) {
        setErrorCode(errorCode);
        this.errors = errors.stream().map(CustomFieldError::new).collect(Collectors.toList());
    }

    private ErrorResponse(ErrorCode errorCode, String exceptionMessage) {
        setErrorCode(errorCode);
        this.errors = List.of(new CustomFieldError("", "", exceptionMessage));
    }
	
    // Response시 of로 Enum인자 받아오기
    public static ErrorResponse of(ErrorCode errorCode){
        return new ErrorResponse(errorCode, Collections.emptyList());
    }

    public static ErrorResponse of(ErrorCode errorCode, BindingResult bindingResult){
        return new ErrorResponse(errorCode, bindingResult.getFieldErrors());
    }

    public static ErrorResponse of(ErrorCode errorCode, String exceptionMessage){
        return new ErrorResponse(errorCode, exceptionMessage);
    }

    public String getCode() { return code; }
    public String getMessage() { return message; }
    public int getStatus() { return status; }
    public List<CustomFieldError> getErrors() { return errors; }
    
    // Enum으로 에러코드 정의
    public enum ErrorCode {
        // Common
        INVALID_INPUT_VALUE(400, "COMMON_001", " Invalid Input Value"),
        METHOD_NOT_ALLOWED(405, "COMMON_002", "Method not allowed"),
        HANDLE_ACCESS_DENIED(403, "COMMON_003", "Access is Denied"),

        // Logical
        ILLEGAL_STATE(400, "STANDARD_001", "illegal state"),
        ILLEGAL_ARGUMENT(400, "STANDARD_002", "illegal argument"),

        // Exception
        EXCEPTION(500, "EXCEPTION", "exception");

        private final String code;
        private final String message;
        private int status;

        ErrorCode(final int status, final String code, final String message) {
            this.status = status;
            this.message = message;
            this.code = code;
        }

        protected String getCode() { return code; }
        protected String getMessage() { return message; }
        protected int getStatus() { return status; }
    }
}

 

 

nested exception is java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for

이 오류는 Spring Framework에서 동일한 예외 클래스(CException)에 대한 여러 @ExceptionHandler 메소드가 존재하여 어떤 메소드를 선택해야 하는지에 대한 모호성이 발생했을 때 발생한다고 함

 

 

이런식으로 중복 클래스가 되어 있으면 처리가 모호해 에러가 발생한다고 한다. 다 각각 예외마다 클래스 생성하자

 

 

반응형

'Backend > Spring | SpringBoot' 카테고리의 다른 글

i18n  (0) 2024.02.19
Tomcat 에러  (0) 2024.02.19
[Spring] 예외처리(Exception Handler)(1)  (0) 2023.11.28
[Spring] RedirectAttributes  (0) 2023.11.07
[Spring Security] CSRF갱신  (0) 2023.11.03