import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
@RequiredArgsConstructor
@Getter
public enum ErrorCode {
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "S-001", "μλ² μλ¬κ° λ°μνμ΅λλ€."),
VALIDATION_FAIL(HttpStatus.BAD_REQUEST, "S-002", "μ ν¨μ± κ²μ¬μ μ€ν¨νμ΅λλ€."),
;
private final HttpStatus httpStatus;
private final String code;
private final String message;
}
import com.openmpy.ecommerce.global.exception.constants.ErrorCode;
import lombok.Getter;
@Getter
public class CustomException extends RuntimeException {
private final ErrorCode errorCode;
public CustomException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.errorCode = errorCode;
}
}
import com.openmpy.ecommerce.global.exception.constants.ErrorCode;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(CustomException.class)
public ResponseEntity<ErrorResponseDto> handleBusinessException(CustomException e) {
ErrorResponseDto responseDto = new ErrorResponseDto(e.getErrorCode().getCode(), e.getMessage(), null);
return new ResponseEntity<>(responseDto, e.getErrorCode().getHttpStatus());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponseDto> handleValidationException(MethodArgumentNotValidException e) {
Map<String, String> errors = new HashMap<>();
for (FieldError error : e.getBindingResult().getFieldErrors()) {
errors.put(error.getField(), error.getDefaultMessage());
}
ErrorResponseDto responseDto =
new ErrorResponseDto(ErrorCode.VALIDATION_FAIL.getCode(), ErrorCode.VALIDATION_FAIL.getMessage(), errors);
return new ResponseEntity<>(responseDto, ErrorCode.VALIDATION_FAIL.getHttpStatus());
}
}
import java.util.Map;
public record ErrorResponseDto(
String code,
String message,
Map<String, String> errors) {
}
ν΄λΌμ΄μΈνΈ μΈ‘μ λ΄λ €μ€ λ§ν λ΄μ©μ HTTP μν μ½λ, 컀μ€ν μλ¬ μ½λ, μλ¬ λ©μμ§, μ ν¨μ± κ²μ¬ κ²°κ³Ό λ±μ΄ μλ€.
μ ν¨μ± κ²μ¬μ μ€ν¨νλ€λ©΄ errors νλμ Map κ΅¬μ‘°λ‘ μμΈ μ²λ¦¬ κ²°κ³Ό λ΄μ©μ΄ λ€μ΄κ°λ€.
μ¦, μλ¬κ° λ°μνλ©΄ μλμ κ°μ μμλ‘ μλ΅ κ°μ λνλΈλ€.
HTTP/1.1 500
Content-Type: application/json
Transfer-Encoding: chunked
Date: Tue, 11 Jun 2024 13:54:31 GMT
Connection: close
{
"code": "S-001",
"message": "μλ² μλ¬κ° λ°μνμ΅λλ€.",
"errors": null
}