BasicErrorController

tokkaiiii·2025년 5월 24일

spring-mvc

목록 보기
25/27

기본 경로는 /error 로

@Controller
@RequestMapping({"${server.error.path:${error.path:/error}}"})
public class BasicErrorController extends AbstractErrorController {

RequestMapping 선언한 메소드 두개

@RequestMapping(
    produces = {"text/html"}
  )
  public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
    HttpStatus status = this.getStatus(request);
    Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.getErrorAttributeOptions(request, MediaType.TEXT_HTML)));
    response.setStatus(status.value());
    ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);
    return modelAndView != null ? modelAndView : new ModelAndView("error", model);
  }

  @RequestMapping
  public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
    HttpStatus status = this.getStatus(request);
    if (status == HttpStatus.NO_CONTENT) {
      return new ResponseEntity(status);
    } else {
      Map<String, Object> body = this.getErrorAttributes(request, this.getErrorAttributeOptions(request, MediaType.ALL));
      return new ResponseEntity(body, status);
    }
  }

실행하면
ErrorMvcAutoConfiguration 클래스에서
DefaultErrorViewResolver bean이 생성되고
이후 view 생성할 때 아래 경로에 파일이 있는지 보고 생성한다

그리고 BasicErrorController 생성

controller 에서 한번 요청 보내보자
response.sendError 로 요청
was에서 포워딩해서 여기로 옴

 @RequestMapping(
    produces = {"text/html"}
  )
  public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
    HttpStatus status = this.getStatus(request);
    Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.getErrorAttributeOptions(request, MediaType.TEXT_HTML)));
    response.setStatus(status.value());
    ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);
    return modelAndView != null ? modelAndView : new ModelAndView("error", model);
  }

request 로 부터 status를 얻는다

 request, HttpServletResponse response) {

그러고서 response에 상태값 넣고 ModelAndView 생성

 response.setStatus(status.value());
    ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);
    return modelAndView != null ? modelAndView : new ModelAndView("error", model);

모델을 집어 넣기 때문에 view만 있으면 되는데
DefaultErrorViewResolver 가 함

 private ModelAndView resolve(String viewName, Map<String, Object> model) {
 // 여기서 이름 생성 ex. error/404 (status로 부터 가져옴)
    String errorViewName = "error/" + viewName;
    TemplateAvailabilityProvider provider = this.templateAvailabilityProviders.getProvider(errorViewName, this.applicationContext);
    return provider != null ? new ModelAndView(errorViewName, model) : this.resolveResource(errorViewName, model);
  }
profile
풀스택 자바 개발자입니다

0개의 댓글