2010-06-03 4 views
3

SimpleMappingExceptionResolver를 사용하여 작동 방식을 확인하고 클라이언트에서 사용할 수 있는지 여부를 확인하려고했지만 이해하는데 문제가 있습니다.Spring SimpleMappingExceptionResolver가 기본보기로 돌아 가지 않음

내가 시도한 것은 응용 프로그램의 특정 페이지를 방문하여 handleRequestInternal 메서드에서 예외를 throw하는 것입니다.

DataAccessException의 하위 클래스 인 RecoverableDataAccessException을 throw하면 올바른 오류 페이지가 예상대로 표시됩니다.

freemarker.core.InvalidReferenceException 또는 java.lang.NumberFormatException을 던지면 예외가 페이지로 이동하여 기본 500 오류 페이지 (즉, 스타일 지정 없음)가 표시됩니다.

아래는 내가 사용하고있는 매핑입니다.

<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
    <property name="exceptionMappings"> 
     <props> 
      <prop key="org.springframework.dao.DataAccessException">/general/error/500</prop> 
      <prop key="freemarker.core.InvalidReferenceException">/general/error/500</prop> 
      <prop key="NumberFormatException">/general/error/500</prop> 
     </props> 
    </property> 
    <property name="defaultErrorView" value="/general/error/500" /> 
</bean> 

적어도 기본 오류보기로 인해 예외가 발생하고 특정 오류 페이지가 표시 될 것으로 예상했지만 그럴 수는 없습니다.

여기 SimpleMappingExceptionHandler를 올바르게 사용하고 있습니까?

[edit] 부두를 사용하고 있습니다.

[편집] 나는 SMER가 렌더링 과정에서 던져진 에러를 처리하지 못한다는 것을 깨달았는데, 나는 그것이 특별히 문제를 일으킨 것들을 잡을 수없는 이유를 설명한다. SMER는 500 가지 스타일 오류에 대처할 수 있습니까?

답변

9

확인한 것처럼 SimpleMappingExceptionResolver은보기 레이어에서 발생한 예외에 대해서는 작동하지 않습니다. 이름에서 알 수 있듯이 핸들러 (즉 컨트롤러)가 던진 예외 만 처리하는 HandlerExceptionResolver 인터페이스를 구현합니다.

보기에서 발생하는 예외를 처리해야하는 경우 메서드를 재정의하거나 이 아닌 스프링 서블릿을 작성하면 HandlerInterceptor을 쓸 수 있습니다. 두 경우 모두, Spring의 view resolver의 이점을 얻지 못할 것이다. 직접 렌더링을 처리해야 할 것이다.

경고의 한 단어 - 뷰 계층에서 예외가 발생하면 예외가 발생하면 서버가 클라이언트에보기 출력을 플러시하기 시작했을 수 있으므로 항상 정상적으로 처리 할 수있는 것은 아닙니다. 어떤 경우에는 서버가 별도의 오류 페이지를 렌더링 할 수 없습니다. 이것이 컨트롤러 레이어에서 할 수있는만큼의 논리를 수행하는 것이 좋은 습관 인 이유입니다. 예외가 가능한 한 빨리 발견되도록하십시오.

+1

정말 좋은 조언입니다. 감사합니다. – Rachel

관련 문제