Exception 처리 방법
1. 에러페이지
2. 4XX, 5XX
3. 클라이언트가 200외에 처리를 하지 못할 때는 200을 내려주고 BODY에 별도의 에러 메세지 전달
Exception Annotation
@ControllerAdvice | : ViewResolver를 사용하는 Global 예외처리 및 특정 패키지 및 컨트롤러 예외처리 |
@RestControllerAdvice | : RestController를 사용하는 Global 예외처리 및 특정 패키지 및 컨트롤러 예외처리 |
@ExceptionHandler | : 특정 컨트롤러의 예외처리 |
1. Exception Annotation 사용
User.java
public class User {
@NotEmpty
@Size(min = 1,max = 100)
private String name;
@Min(1)
@NotNull
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
GlobalContorllerAdvice.java - @RestControllerAdvice 사용
@RestControllerAdvice
//@RestControllerAdvice(basePackages = "com.example.exception.controller") 해당 패키지 내 Exception 을 잡음
public class GlobalControllerAdvice {
// Exception 에러를 핸들러로 잡아서 해당 메소드 실행
@ExceptionHandler(value = Exception.class)
public ResponseEntity exception(Exception e){
System.out.println("@ExceptionHandler(value = Exception.class) : ");
System.out.println(e.getClass().getName());
System.out.println(e.getLocalizedMessage()); // 해당 Exception 내용
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(""); // 빈 응답
}
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity MethodArgumentNotValidException(MethodArgumentNotValidException e){
System.out.println("@MethodArgumentNotValidException(value = MethodArgumentNotValidException.class) : ");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); // 해당 에러 메시지내용 응답
}
}
ApiController.java - 컨트롤러 내 ExceptionHandler
@RestController
@RequestMapping("/api/user")
public class ApiController {
/*
* (required = false) 필수값 아님, 해당 값이 없더라도 동작하고 null값 지정, default는 true
*/
@GetMapping("")
public User get(@RequestParam(required = false) String name, @RequestParam(required = false) Integer age){
User user = new User();
user.setAge(age); // NPE 발생, 500에러
user.setName(name);
int a = 10 + age;
return user;
}
@PostMapping("")
public User post(@Valid @RequestBody User user){
System.out.println(user);
return user;
}
// 우선순위는 컨틀롤러 ExceptionHandler가 Global 보다 우선.
// 해당 컨틀롤러에 클라이언트가 요청시 Exception 발생한 것들중에 ExceptionHandler 존재하는 것 캐치.
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity MethodArgumentNotValidException(MethodArgumentNotValidException e){
System.out.println("ApiController @MethodArgumentNotValidException(value = MethodArgumentNotValidException.class) : ");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); // 해당 에러 메시지내용 응답
}
}
POST방식 HTTP 요청 BODY(컨트롤러 내 ExceptionHandler 주석처리후 GlobalControllerAdvice 사용)
{
"name":"",
"age":0
}
POST방식 HTTP 응답 BODY
Validation failed for argument [0] in public com.example.exception.dto.User com.example.exception.controller.ApiController.post(com.example.exception.dto.User) with 3 errors: [Field error in object 'user' on field 'name': rejected value []; codes [Size.user.name,Size.name,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.name,name]; arguments []; default message [name],100,1]; default message [크기가 1에서 100 사이여야 합니다]] [Field error in object 'user' on field 'name': rejected value []; codes [NotEmpty.user.name,NotEmpty.name,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.name,name]; arguments []; default message [name]]; default message [비어 있을 수 없습니다]] [Field error in object 'user' on field 'age': rejected value [0]; codes [Min.user.age,Min.age,Min.int,Min]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.age,age]; arguments []; default message [age],1]; default message [1 이상이어야 합니다]]
콘솔 결과
@MethodArgumentNotValidException(value = MethodArgumentNotValidException.class) :
'Spring > 98. Infra' 카테고리의 다른 글
4. Spring Filter와 Interceptor (0) | 2022.11.14 |
---|---|
3. Spring Boot Validation과 Exception 예제 (0) | 2022.11.07 |
1. Spring Boot Validation (0) | 2022.11.07 |