spring@Controller Advice 처리 이상 사용자 정의 이상 문제 와 정확하게 일치 하지 않 습 니 다.
3842 단어 spring-boot
문제 설명:1.@Controller Advice 를 사용 하여@ExceptionHandler 와 함께 전역 이상 을 처리 할 때 AppException(extends Exception)을 사용자 정의 합 니 다.일부 전역 적 인 매개 변 수 는 통일 적 으로 검증 해 야 하기 때문에 모든 contrller 방법 에 AOP 검 사 를 추가 합 니 다.매개 변수 검사 가 통과 되 지 않 으 면 AppException 2,@Controller Advice 에 표 시 된 클래스 를 던 집 니 다.주로 두 개의@Exception Handler 가 있 는데 각각 AppException.class 와 Throwable.class 와 일치 합 니 다.3.테스트 할 때 전역 AOP 의 매개 변수 검사 가 통과 되 지 않 아 AppException 을 던 졌 습 니 다.그러나 이 AppException 은 우리 가 원 하 는 AppException.class 가 아 닌 Throwable.class 에 일치 하 는 것 을 발 견 했 습 니 다.
분석 과정:
한 단계
처음에 테스트 를 해 온 두 가지 서로 다른 요청(하 나 는 swagger 를 통 해 하 나 는 관광 기 를 통 해 주 소 를 입력 하고 두 가지 요청 이 비슷 해서 같은 요청 인 줄 알 았 습 니 다)으로 인해 한 방법 에 AppException 을 던 졌 습 니 다.하 나 는 없 었 습 니 다.그리고 이 문 제 를 발 견 했 을 때 나타 나 지 않 았 습 니 다.안정 적 으로 재현 할 수 없 기 때문에 저 는 AppException 에 문제 가 생 겼 을 것 이 라 고 추측 합 니 다.그래서 저 는 AppException 을 수정 하고 아버지 류 를 Runtime Exception 으로 바 꾼 후에 문제 가 해결 되 었 습 니 다.
2 단계
문제 가 해 결 된 후에 저 는 왜 이런 상황 이 발생 했 는 지 생각 했 습 니 다.자바 의 이상 시스템 에 따 르 면 Exception 을 계승 하 든 Runtime Exception 을 계승 하 든 Throwable.class 에 일치 하지 않 을 것 입 니 다.나 는 이상 한 집행 과정 을 다시 한 번 추적 했다.대충 한 번 살 펴 보 니 아래 의 이 위치 에 차이 가 생 겼 다.
catch (InvocationTargetException ex) {
// Unwrap for HandlerExceptionResolvers ...
Throwable targetException = ex.getTargetException();
if (targetException instanceof RuntimeException) {
throw (RuntimeException) targetException;
}
else if (targetException instanceof Error) {
throw (Error) targetException;
}
else if (targetException instanceof Exception) {
throw (Exception) targetException;
}
else {
String text = getInvocationErrorMessage("Failed to invoke handler method", args);
throw new IllegalStateException(text, targetException);
}
}
성공 은 Exception,실 패 는 Runtime Exception.이 럴 때@Controller Advice 에 표 시 된 클래스 가 되면 문제 가 발생 합 니 다.AppException 을 계승 하 는 것 은 Runtime Exception 과 동급 이기 때문에 runtime Exception 이라는 판단 조건 에서 던 진 이상 은 AppException 에 일치 하지 않 을 수 밖 에 없습니다.
이 때 이상 유형 을 자세히 비교 해 보면 정확 한 이상 유형 을 발견 할 수 있 을 때 AppException,잘못된 이상 유형 을 발견 할 때 java.lang.reflect.Undeclared ThrowableException,내부 에 AppException 이 포함 되 어 있 습 니 다.
JDK 의 자바 doc 는 Undeclared ThrowableException 을 이렇게 설명 합 니 다.프 록 시 인 스 턴 스 호출 처리 프로그램의 invoke 방법 이 검 사 를 거 친 이상(Runtime Exception 이나 Error 에 할당 할 수 없 는 Throwable)을 던 지면 이 이상 은 이 방법의 throws 서브 국 에서 설명 한 이상 류 에 할당 할 수 없습니다.프 록 시 인 스 턴 스 의 방법 으로 이 이상 을 던 집 니 다.
AppException 이 Exception 에 계승 되 기 때문에 대리 가 던 진 이상 은 AppException 을 포함 한 Undeclared ThrowableException 입 니 다.@Controller Advice 가 일치 할 때 자 연 스 럽 게 일치 하지 않 습 니 다.앱 익 스 펙 션 이 런 타임 익 스 펙 션 에 계승 되 었 을 때 던 진 이상 은 여전히 앱 익 스 펙 션 이 므 로 일치 할 수 있 습 니 다.
결론.
그래서 해결 방법 은 두 가지 가 있 습 니 다.AppException 이 Runtime Exception 이나 Controller 를 계승 하 는 방법 으로 AppException 이상 을 던 집 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Keycloak이 Active Directory에 등록된 사용자로 인증할 수 있도록 합니다.사내 시스템을 출시함에 있어서, 전회사에서는 Web시스템마다 로그인하고 있어 혐오가 있었으므로, 꼭 싱글 사인온으로 하고 싶다고 생각했다. 그 실현에, 옛날 조금만 평가한 OpenAM라든지의 정보를 구구어 낚시하기 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.