2017-12-12 4 views
0

컨트롤러 기반의 봄 예외 처리기를 사용할 때 작동하지 않습니다. 뷰는 expected.Why 이외 이하, 신청 후봄 예외 처리기가 작동하지 않습니다.

@Controller 
public class PageController { 

    @RequestMapping("/page") 
    public ModelAndView index(ModelAndView modelAndView){ 
     String mess = null; 
     mess.split(","); 
     modelAndView.setViewName("index"); 
     return modelAndView; 
    } 

    @ExceptionHandler({Exception.class}) 
    @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "Bad Request") 
    public ModelAndView handleException(Exception ex, HttpServletRequest request,  HttpServletResponse response){ 
     ModelAndView modelAndView = new ModelAndView(); 
     modelAndView.addObject("message", ex.getMessage()); 
     modelAndView.addObject("url", request.getRequestURL()); 
     modelAndView.addObject("code", response.getStatus()); 
     modelAndView.setViewName("exception"); 
     return modelAndView; 
    } 
} 

http://localhost:8080/page를 방문, 디버그 모드로 시작하고, handleException가 실행되었습니다

내 코드는 여기에? enter image description here

답변

0

@ResponseStatus 주석에 문제가 있습니다. 다음 기사를보십시오 : http://blog.sizovs.net/spring-rest-exception-handler/. 이 문서의 중간에서 저자는 다음 말한다 :

경고 :이 주석의 이유 속성을 설정할 때 예외 클래스에이 주석을 사용하거나 때 HttpServletResponse.sendError 방법이 사용됩니다. HttpServletResponse.sendError를 사용하면 응답이 완료된 것으로 간주되므로 더 이상 기록하지 않아야합니다. 또한 서블릿 컨테이너는 일반적으로 REST API에 적합하지 않은 이유로 HTML 오류 페이지를 작성합니다. 이 경우 반환 유형으로 org.springframework.http.ResponseEntity를 사용하고 @ResponseStatus를 함께 사용하지 않는 것이 좋습니다.

봄 기사에 따르면 : https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc 스프링 MVC 체인 울부 짖는 순서대로 다음과 같은 세 가지 해결 :

  • ExceptionHandlerExceptionResolver 핸들러 모두에 적합 @ExceptionHandler 방법에 대한 캐치되지 않는 예외 (컨트롤러)와 일치 및 모든 컨트롤러 조언.
  • DefaultHandlerExceptionResolver 표준 봄 예외를 변환하고 (나는 그것이 스프링 MVC 내부와 같이 위의이 언급하지 않은) HTTP 상태 코드에 변환 (1 절에 설명 된대로)
  • ResponseStatusExceptionResolver은 @ResponseStatus에 의해 주석 캐치되지 않는 예외를 찾습니다 .

는 그래서 ResponseStatusExceptionResolver는 ExceptionHanlderExceptionResolver 후 트리거 및 기본값을 사용하고, 봄의 오류 페이지를 표시합니다.

@ResponseStatus를 빨리 제거하려고하면 브라우저에 사용자 정의 오류 페이지가 표시됩니다.