2014-09-06 4 views
1

에서 작동, 나는 아마도 SimpleMappingExceptionResolver 아이디어는 IllegalArgumentException 및 MissingServletRequestParameterException을 위해, 나는 또한 약간 다른 오류 화면의 HTTP 상태 코드를 원하는 것을 thusly 히아마도 SimpleMappingExceptionResolver는 봄 2.5.6 사용하여 몇 가지 예외

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
    <property name="exceptionMappings"> 
     <props> 
      <prop key="MismatchException">error/mismatch-error</prop> 
      <prop key="Exception">error/${module.render.error.logical.page}</prop> 
      <prop key="IllegalArgumentException">error/module-illegal-arg</prop> 
      <prop key="MissingServletRequestParameterException">error/module-illegal-arg</prop> 
     </props> 
    </property> 
</bean> 

를 구성한 400이 반환되었습니다.

IllegalArgumentException이 정상적으로 작동하면 참조 된 JSP가 상태를 400으로 올바르게 설정합니다. MissingServletRequestParameterException이 작동하지 않고 Generic 500 오류가 발생합니다.

답변

1

몇 시간이 지나면 web.xml에 error/module-illegal-arg.jsp 또는 다른 추가 구성에 버그가있을 수 있다고 생각하여 디버거로 건너 뛰고 getDepth() 메소드까지 추적했습니다. SimpleMappingExceptionResolver.java의 메소드

기본적으로 예외 항목은 MissingServletRequestParameterException과 일치합니다. Exception은 수퍼 클래스이지만, 접근 방법은 수 개의 레벨에 직접 일치하는 것을 선호 할 것이라고 생각할 것입니다. 사실 그것은 getDepth()의 전체 목적입니다. 행에서 366 마지막 단서 제공 : 그러니까 기본적으로

if (exceptionClass.getName().indexOf(exceptionMapping) != -1) { 

를, 예외는 이름에 작업 예외로 0의 깊이 레벨에서 모든 클래스를 일치합니다.

그럼 왜 IllegalArgumentException이 작동하고 MissingServletRequestParameterException이 실행되지 않았습니까? 기본 저장소는 HashTable입니다. IllegalArgumentException가 Exception보다 초기의 값에 해시됩니다. 예외가 MissingServletRequestParameterException보다 이전 값으로 해시되었습니다.

최종 수정 :

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
    <property name="exceptionMappings"> 
     <props> 
      <prop key="MismatchException">error/mismatch-error</prop> 
      <!-- 
       The full path is here in order to prevent matches on every class with the word 
       'Exception' in its class name. The resolver will go up the class hierarchy and will 
       still match all derived classes from Exception. 
      --> 
      <prop key="java.lang.Exception">error/${module.render.error.logical.page}</prop> 
      <prop key="IllegalArgumentException">error/module-illegal-arg</prop> 
      <prop key="MissingServletRequestParameterException">error/module-illegal-arg</prop> 
     </props> 
    </property> 
</bean>