본문 바로가기

Backend/Spring | SpringBoot

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

반응형

ErrorControll

가장 편한건 ResponseEntity로 처리 하는 방법

아직도 에러 메시지 처리에 대한 내용이 제대로 이해되지 않아 좀더 공부가 필요

 

일단 Controller에서만 독단적으로 처리하는 방법도 있지만 이렇게 하면 다른 컨트롤러에서는 사용이 불가능해서 객체지향적이지 못하다

private HashMap<String, Object> createErrorResponse(String errorMessage) {
	HashMap<String, Object> errorResponse = new HashMap<>();
	errorResponse.put("errorCode", errorMessage);
	errorResponse.put("errorMsg", errorMessage);
	return errorResponse;
}
    
@RequestMapping(value = "/table/cancerData/scatter")
public ResponseEntity<HashMap<String,Object>> getScatterTableDataAPI(HttpServletRequest request, HttpServletResponse response, @RequestParam String dataCode, 
		@RequestParam String regionType, @RequestParam(required=false, defaultValue="false") Boolean isTemp) throws Exception {
	HashMap<String,Object> resultMap = new HashMap<String,Object>();
	HashMap<String,String> dataCodeMap = new HashMap<String,String>();
	dataCodeMap.put("dataCode", dataCode);
	dataCodeMap.put("regionType", regionType);
		
	...

	Object someValue = resultMap.get("someKey");
	if (someValue == null) {
		return ResponseEntity.status(HttpStatus.NOT_FOUND)
			.contentType(org.springframework.http.MediaType.APPLICATION_JSON)
			.body(createErrorResponse("someKey is null"));
	}
	return ResponseEntity.ok()
		.contentType(org.springframework.http.MediaType.APPLICATION_JSON)
		.body(resultMap);
}

 

그래서 보통은 ExceptionHandler를 만들어서 한번에 컨트롤 하는 방법을 쓴다.

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice
public class GlobalExceptionHandler {
	
    // 예외에 맞는 Excption class를 사용
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ResponseEntity<String> handleException(Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body("Internal Server Error: " + e.getMessage());
    }
	
    // 예외에 맞는 Excption class를 사용
    @ExceptionHandler(NullPointerException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ResponseEntity<String> handleNullPointerException(NullPointerException e) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                .body("Bad Request: " + e.getMessage());
    }

    // 다른 예외에 대한 핸들러를 필요에 따라 추가할 수 있음
}

 

 

예외처리(2)

스프링에서 커스텀 에러처리 하던중 에러 발생

Caused by: java.lang.IllegalStateException:
	Ambiguous @ExceptionHandler method mapped for [class java.lang.Exception]: ~

 

찾아보니 스프링의 @ExceptionHandler 에 이미 위 Exception에 대한 정의가 있어 중복될때 발생한다고 함
@ExceptionHandler 대신 @Override를 사용해서 처리 가능하다는데

일단 나는 @Override를 지웠더니 상속관계가 맞지않다고 처리가 되지 않아 아예 @ExceptionHandler(~.class)를 지웠더니 에러는 사라짐

 

HeadersBuilder BodyBuilder

 

 

// 원본
//return ResponseEntity.notFound()
//		.body(createErrorResponse(statusCode, "Bad Request"));
// 수정
return ResponseEntity.status(HttpStatus.NOT_FOUND)
		.body(createErrorResponse(statusCode, "Bad Request"));

 

반응형

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

Tomcat 에러  (0) 2024.02.19
[Spring] 예외처리(Exception Handler)(2)  (0) 2023.11.30
[Spring] RedirectAttributes  (0) 2023.11.07
[Spring Security] CSRF갱신  (0) 2023.11.03
[Spring] SQLErrorCodesFactory  (0) 2023.10.06