오답노트
[Spring] Exception 본문
Exception
웹에서 예외처리를 낼 수 있는 경우가 적다. 결국에는 상태 코드로 내려줘야하기 때문이다.
Spring에서는 ControllerAdvice 와 ExceptionHandler를 통해 예외처리를 진행한다.
Global Exception
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice()
public class GlobalControllAdvice {
@ExceptionHandler(value = Exception.class)
public ResponseEntity exception(Exception e){
System.out.println(e.getClass().getName());
System.out.println("======");
System.out.println(e.getMessage());
System.out.println("======");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("");
}
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e){
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
클래스에 RestControllAdvice Annotation을 추가하면 발생하는 모든 exception을 가져와 핸들링 할 수 있다.
Local Exception
import com.example.exception.dto.User;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*;
@RequestMapping("/api/user")
@RestController
public class ApiController {
@GetMapping("")
public User get(@RequestParam(required = false) String name, @RequestParam(required = false) Integer age){
User user = new User();
user.setName(name);
user.setAge(age);
int a = 10 + age;
return user;
}
@PostMapping("")
public User post(@Valid @RequestBody User user){
System.out.println(user);
return user;
}
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e){
System.out.println("api controller");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
API 클래스 내에 ExceptionHandler Annotation을 선언하고 value에 받고 싶은 Exception 클래스를 넣으면 해당 API 클래스에서 해당 예외 발생시 핸들링할 수 있다.
'Java > Spring' 카테고리의 다른 글
[Spring] Filter (0) | 2023.07.14 |
---|---|
[Spring] Exception과 Validation (0) | 2023.07.14 |
[Spring] Validation (0) | 2023.07.13 |
[Spring] AOP (0) | 2023.07.13 |
[Spirng] IoC, DI (0) | 2023.07.13 |