Web Application 입장에서, 에러가 났을 때 내려줄수 있는 방법은 많지 않음
에러페이지
400~500대 Error
Client가 200외에 처리를 하지 못할때는 200을 내려주고 별도의 에러 메세지 전달
package com.example.exception.dto;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class User {
@NotEmpty
@Size(min = 1, max = 10)
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 +
'}';
}
}
package com.example.exception.controller;
import com.example.exception.dto.User;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping("/api/user")
public class ApiController {
//required = false는 파라미터 값이 없더라도 null로 생각하고 동작 하게끔 해주는 것
// ?name = 1234 이런게 없더라도 동작한다는 것!
@GetMapping("")
public User get(@RequestParam(required = false) String name, @RequestParam(required = false) Integer age){
User user = new User();
user.setName(name);
user.setAge(age);
// null인 경우 고의로 에러 발생시키기 위해
int a = 10 + age;
return user;
}
@PostMapping
public User post(@Valid @RequestBody User user){
System.out.println(user);
return user;
}
// 여기다 붙여넣기 하면 이 컨트롤러에서 발생하는 Exception만 잡음
// 글로벌 핸들러 보다 여기가 우선순위 더 높음
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity MethodArgumentNotValidException(MethodArgumentNotValidException e){
System.out.println("api controller");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
package com.example.exception.advice;
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;
@RestControllerAdivce()
public class GlobalControllerAdvice{
// 모든 예외를 다 잡을꺼야, 지정안하면 Spring의 글로벌 Excpetion Handler가 동작 될 것
@ExceptionHandler(value = Exception.class)
public ResponseEntity exception(Exception e)
// getName을 통해 발생한 exception의 클래스 이름을 알수 있다
System.out.println(e.getClass().getName());
System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
System.out.println(e.getLocalizedMessage());
System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
//body에 담은 메세지가 사용자 화면에 출력
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("");
}
// 특정 메서드에 예외를 잡고 싶은 경우
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity MethodArgument(MethodArgumentNotValidException e){
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}