2012-11-21 4 views
7

spring-mvc 컨트롤러와 관련하여 모범 사례 질문을하고 싶습니다. 아래 코드를 검토하십시오 :스프링 -mvc 컨트롤러 및 예외 처리

@Autowired 
    SomeService service; 

    @RequestMapping (...) 
    public @ResponseBody Response createSomething() { 

     try { 

      serviceResponse = service.doSomething(); 

      //create a success response and return 

     } 
     catch (SomeServiceException e) { 
      //create an error response and return 
     } 

} 

컨트롤러 수준의 일반 관행에서 오류 처리를 수행합니까? 또는 서비스 클래스가 위에 표시된 예외를 throw하지 않아야합니다. 검토하여 알려주십시오.

답변

7

사용 사례에 따라 세 가지 전략이 있다고합니다.

약 3 가지 전략이 있습니다 (HandlerExceptionResolver, @ExceptionHandler). 행동 내부에서 예외를 처리합니다.

사용 사례는 전체 응용 프로그램의 전체 예외 처리기, 전체 컨트롤러, 그에 따라 특정 작업입니다.

+0

모든 이러한 핸들러는 Spring MVC와 만 연결됩니다 권리 ? 필터 또는 컨트롤러 범위 외부에서 예기치 않은 예외를 처리 할 수 ​​있습니까? 그것은 doc에 따라 _Spring'HandlerExceptionResolver' 구현은 컨트롤러 실행 중 발생하는 예기치 않은 예외를 처리하기 때문에 ** 즉, 컨트롤러 실행 중 ** – agpt

+0

지능형 라우팅이 이루어지는 Spring 클라우드와 함께 스프링 부트를 사용하고 있습니다. 따라서 스프링 MVC가 필요 없다. 글로벌 레벨 예외를 처리하는 가장 좋은 방법은 무엇일까요? AOP 기반 솔루션? – agpt

1

서비스 클래스는 예외를 throw 할 수 있습니다. 컨트롤러에서 예외를 처리 할 수 ​​있습니다 .. 또한 컨트롤러에서 잡힌 예외를 기준으로 적절한 오류 페이지를 표시 할 수 있습니다.하지만 지루할 것입니다. 스프링 예외 처리를 시도하십시오 .http : //www.mkyong.com/spring-mvc/spring-mvc-exception-handling-example/

+0

Rajesh :이 컨트롤러에서보기를 반환하지 않습니다. json/ResponseBody를 반환하고 있으므로 오류 페이지가 표시되지 않습니다. 그러나 try 및 catch 블록을 수행하는 대신 @ExceptionHandler를 사용하는 것이 좋습니다. 그게 효과가 있니? 감사합니다. 감사합니다. – Khush

+0

Khush .. 어느 쪽이든 컨트롤러에서 예외를 catch하고 json 결과로 적절한 오류 메시지를 보내고 그에 따라 화면에 표시 할 수 있습니다.이 경우에는 약간의 예외적 인 경우도 있지만 ..이 예외 처리기를 소개하고 ajax U의 경우 errorpage.html을 아약스 응답으로 얻을 수 있습니다. 그런 다음 화면의 div 또는 iframe에서이 페이지를 업데이트 할 수 있습니다. 답변 포인트를 얻을 수 있도록 투표 할 수 있습니다 :) – Rajesh

2

@ExceptionHandler를 사용하는 것이 가장 좋습니다. 컨트롤러 메소드에서 예외를 처리 할 때의 단점은 코드를 읽기 쉽게 만들고 많은 컨트롤러 메소드에서 반복 될 수 있다는 것입니다.

@ExceptionHandler가 정의 된 컨트롤러에 대한 기본 클래스를 갖는 것이 좋습니다. 이렇게하면 코드 중복없이 여러 컨트롤러에서 사용할 수 있습니다. 이것은 예외 해석자 접근법보다 읽기 쉽지만 함께 사용될 수 있습니다.

0

Handler 클래스의 Bean 정의 파일에 Bean을 정의하십시오. 프로그램에서 예외가 발생하면 resolveException 메서드가 호출됩니다.

public class Handler 
     implements HandlerExceptionResolver 
    { 

     public Handler() 
     { 
     } 

     public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 
     { 
      if(ex instanceof ErrorType1Exception)) 
      { 
       ModelAndView test = new ModelAndView("errorpage1jsppage"); 
return test; 
      } else 
      if(ex instanceof ErrorType2Exception)) 
      { 
       ModelAndView test1 = new ModelAndView("errorpage2jsppage"); 
return test1 
      } 
     } 
    } 
관련 문제