Spring Boot 상세 인쇄 시작 시 이상 스 택 정보 상세 분석

머리말
SpringBoot 가 프로젝트 를 시작 할 때 이상 이 발생 하면 구체 적 인 스 택 오류 정 보 를 우호 적 으로 인쇄 하지 못 합 니 다.우 리 는 간단 한 오류 메시지 만 볼 수 있 기 때문에 발생 하 는 문 제 를 제때에 해결 하지 못 합 니 다.이 문제 에 대해 SpringBoot 는 고장 분석 기의 개요(failure-analyzer)를 제공 하고 내부 에서 서로 다른 유형의 이상 에 따라 실현 을 제공 합 니 다.우리 가 사용자 정의 하려 면 어떻게 해 야 합 니까?
FailureAnalyzer
SpringBoot 는 이상 분석 인 터 페 이 스 를 시작 하 는 Failure Analyzer 를 제공 합 니 다.이 인 터 페 이 스 는 org.springframework.boot.diagnosticspackage 에 있 습 니 다.
내부 에서 하나의 분석 방법 만 제공 하고 소스 코드 는 다음 과 같다.

@FunctionalInterface
public interface FailureAnalyzer {

 /**
 * Returns an analysis of the given {@code failure}, or {@code null} if no analysis
 * was possible.
 * @param failure the failure
 * @return the analysis or {@code null}
 */
 FailureAnalysis analyze(Throwable failure);

}
이 인 터 페 이 스 는 만 나 는 이상 대상 인 스 턴 스 Throwable failure 를 실현 클래스 에 전달 하고 클래스 를 사용자 정의 로 처리 합 니 다.
AbstractFailureAnalyzer
AbstractFailureAnalyzer 는 FailureAnalyzer 의 기초 로 추상 류 를 실현 하고 FailureAnalyzer 가 정의 하 는 analyzer(Throwable failure)방법 을 실현 하 며 이상 유형 을 지정 하 는 추상 적 인 방법 analyzer(Throwable rootFailure,T cause)를 제공 합 니 다.소스 코드 는 다음 과 같 습 니 다.

public abstract class AbstractFailureAnalyzer<T extends Throwable> implements FailureAnalyzer {

 @Override
 public FailureAnalysis analyze(Throwable failure) {
 T cause = findCause(failure, getCauseType());
 if (cause != null) {
  return analyze(failure, cause);
 }
 return null;
 }

 /**
 * Returns an analysis of the given {@code rootFailure}, or {@code null} if no
 * analysis was possible.
 * @param rootFailure the root failure passed to the analyzer
 * @param cause the actual found cause
 * @return the analysis or {@code null}
 */
 protected abstract FailureAnalysis analyze(Throwable rootFailure, T cause);

 /**
 * Return the cause type being handled by the analyzer. By default the class generic
 * is used.
 * @return the cause type
 */
 @SuppressWarnings("unchecked")
 protected Class<? extends T> getCauseType() {
 return (Class<? extends T>) ResolvableType.forClass(AbstractFailureAnalyzer.class, getClass()).resolveGeneric();
 }

 @SuppressWarnings("unchecked")
 protected final <E extends Throwable> E findCause(Throwable failure, Class<E> type) {
 while (failure != null) {
  if (type.isInstance(failure)) {
  return (E) failure;
  }
  failure = failure.getCause();
 }
 return null;
 }

}
AbstractFailure Analyzer 소스 코드 를 통 해 알 수 있 듯 이 Failure Analyzer 의 인터페이스 방법 에서 특수 처 리 를 했 습 니 다.getCause Type()방법 에 따라 현재 클래스 정의 의 첫 번 째 범 형 유형,즉 우리 가 분석 해 야 할 지정 이상 유형 을 얻 었 습 니 다.
범 형 이상 유형 을 가 져 온 후 방법 findCause 에 따라 Throwable 이 범 형 이상 유형 과 일치 하 는 지 판단 하고 일치 하면 SpringBoot 에 직접 등록 처리 합 니 다.
SpringBoot 가 제공 하 는 분석 실현
SpringBoot 내 부 는 AbstractFailure Analyzer 추상 류 를 실현 함으로써 일련의 목적 성 이상 유형의 시작 분석 을 정의 했다.다음 그림 과 같다.

지정 이상 분석
SpringBoot 내부 에서 제공 하 는 작 동 이상 분석 은 모두 구체 적 인 이상 유형 을 지정 하여 이 루어 진 것 입 니 다.가장 흔히 볼 수 있 는 오 류 는 포트 번호 가 점용 되 는 것 입 니 다(PortInUseException).SpringBoot 내부 에서 이 이상 한 작 동 분석 을 제공 하지만 우 리 는 이 이상 분석 을 대체 할 수 있 습 니 다.우 리 는 PortInUseException 이상 의 AbstractFailure Analyzer 를 만 들 고 클래스 를 SpringBoot 에 등록 하면 다음 과 같은 사용자 정의 가 가능 합 니 다.

/**
 *       {@link PortInUseException}      
 *
 * @author     
 */
public class PortInUseFailureAnalyzer extends AbstractFailureAnalyzer<PortInUseException> {
 /**
  * logger instance
  */
 static Logger logger = LoggerFactory.getLogger(PortInUseFailureAnalyzer.class);

 @Override
 protected FailureAnalysis analyze(Throwable rootFailure, PortInUseException cause) {
  logger.error("     。", cause);
  return new FailureAnalysis("   :" + cause.getPort() + "   ", "PortInUseException", rootFailure);
 }
}
등록 시작 이상 분석
위 에서 저 희 는 지정 한 이상 시작 분석 만 작 성 했 습 니 다.다음 에 효력 을 발생 시 켜 야 합 니 다.이 효력 발생 방식 은 사용자 정의 SpringBoot Starter AutoConfiguration 과 유사 합 니 다.저 희 는 META-INF/spring.factories 파일 에서 정 의 를 내 려 야 합 니 다.다음 과 같 습 니 다.

org.springframework.boot.diagnostics.FailureAnalyzer=\
 org.minbox.chapter.springboot.failure.analyzer.PortInUseFailureAnalyzer
그럼 우 리 는 왜 이런 방식 으로 정 의 를 내 려 야 합 니까?
프로젝트 시작 에 발생 하 는 이상 순 서 는 확인 되 지 않 습 니 다.Spring IOC 가 초기 화 되 기 전에 이상 이 발생 했 을 가능성 이 높 습 니 다.@Component 주해 형식 으로 적용 할 수 없 기 때문에 SpringBoot 는 spring.factories 설정 파일 을 통 해 정 의 를 제공 합 니 다.
이상 분석 상속 관계 시작
사용자 정의 실행 이상 은 일반적으로 Runtime Exception 에서 계승 합 니 다.Runtime Exception 의 이상 시작 분석 인 스 턴 스 를 정의 하면 어떤 효과 가 있 습 니까?

/**
 *          {@link RuntimeException}      
 *
 * @author     
 */
public class ProjectBootUnifiedFailureAnalyzer extends AbstractFailureAnalyzer<RuntimeException> {
 /**
  * logger instance
  */
 static Logger logger = LoggerFactory.getLogger(ProjectBootUnifiedFailureAnalyzer.class);

 @Override
 protected FailureAnalysis analyze(Throwable rootFailure, RuntimeException cause) {
  logger.error("       ", cause);
  return new FailureAnalysis(cause.getMessage(), "error", rootFailure);
 }
}
이 클래스 도 spring.factories 파일 에 함께 등록 합 니 다.다음 과 같 습 니 다.

org.springframework.boot.diagnostics.FailureAnalyzer=\
 org.minbox.chapter.springboot.failure.analyzer.PortInUseFailureAnalyzer,\
 org.minbox.chapter.springboot.failure.analyzer.ProjectBootUnifiedFailureAnalyzer
프로젝트 를 실행 하고 포트 번호 가 이상 하 게 점용 되 었 음 을 테스트 하면 ProjectBootUnified Failure Analyzer 의 analyzer 방법 을 실행 하지 않 고 PortInUseFailure Analyzer 클래스 의 방법 을 계속 실행 한 것 을 발견 할 수 있 습 니 다.
그러면 우 리 는 PortInUseFailureAnalyzer 라 는 시작 분석 을 spring.factories 파일 에서 잠시 삭제 하고 프로젝트 를 실행 합 니 다.이 때 는 ProjectBootUnified FailureAnalyzer 류 의 분석 방법 을 실행 하 는 것 을 발견 할 수 있 습 니 다.
총결산
이 장 에서 우 리 는 SpringBoot 가 제공 하 는 작 동 이상 분석 인터페이스 와 기본 추상 적 인 실현 류 의 운영 원 리 를 알 게 되 었 고 이상 분석 을 시작 하면 범 형 이상 류 의 상하 상속 관 계 를 분석 하고 이상 서브 류 의 작 동 분석 은 이상 부모 류 의 작 동 분석 을 덮어 버 릴 것 이다.모든 이상 한 시작 분석 을 포함 하고 싶다 면 Exception 을 AbstractFailure Analyzer 의 일반적인 매개 변수 로 사용 해 보 세 요.
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기