처리 오류 SpringBoot- (XII)

SpringBoot 기본 오류 처리 메커니즘

브라우저는 기본 오류 페이지를 반환

 

2. 만약 다른 클라이언트, 기본 응답 JSON 데이터

원리 :

당신은 ErrorMvcAutoConfiguration를 참조 할 수 있습니다, 자동 오류 처리를;

다음과 같은 구성 요소 선박 추가

1 DefaultErrorAttributes

帮我们在页面共享信息; 
@Override 
    공개 지도 <문자열, 개체> getErrorAttributes (RequestAttributes의 requestAttributes,
             부울 includeStackTrace) { 
        지도 <문자열, 개체> errorAttributes =  의 LinkedHashMap <문자열, 개체> (); 
        errorAttributes.put ( "타임 스탬프" 새로운 날짜 ()); 
        addStatus (errorAttributes, requestAttributes); 
        addErrorDetails (errorAttributes, requestAttributes, includeStackTrace); 
        addPath (errorAttributes, requestAttributes); 
        반환 errorAttributes을; 
    }

2 BasicErrorController : 기본 처리 / 오류 관련

@Controller 
@RequestMapping ( "$ {server.error.path : $ {error.path : / 오류}}" )
 공개  수업 BasicErrorController (가) 확장 AbstractErrorController { 
    
    @RequestMapping을 (생산 "텍스트 / html로"=)을 // 생성 된 HTML 데이터 유형 ; 브라우저가 치료의 방법에 요청 전송 
    공공 의 ModelAndView ErrorHtml (HttpServletRequest의 요청 
            HttpServletResponse를 응답) { 
        HttpStatus 상태 = 의 getStatus (요청시), 
        지도 = 모델 <문자열, 개체> Collections.unmodifiableMap (getErrorAttributes ( 
                요청을 isIncludeStackTrace (요청, MediaType.TEXT_HTML)));
        것은 response.setStatus (status.value ()); 
        
         에러 페이지 등의 페이지, 페이지 어드레스 및 콘텐츠를 포함하는 페이지//
        의 ModelAndView의 ModelAndView = resolveErrorView (요청, 응답, 상태 모델);
        반환 (ModelAndView를 == null이 ?  의 ModelAndView ( "오류" , 모델)의 ModelAndView); 
    } 

    @RequestMapping 
    @ResponseBody     // 产生JSON数据,其他客户端来到这个方法处理; 
    공공 ResponseEntity <지도 <문자열, 객체 >> 에러 (HttpServletRequest의 요청) { 
        지도 <문자열 오브젝트> 본체 = getErrorAttributes (요청 
                isIncludeStackTrace ( 요청 MediaType.ALL)); 
        HttpStatus 상태 = 의 getStatus (요청);
        반환  새로운ResponseEntity <지도 <문자열, 객체 >> (몸 상태); 
    }

3 ErrorPageCustomizer

@Value ( "{$의 error.path : / 오류}" )
     개인 = "/ 오류"문자열 경로, 시스템 오류 프로세스에게 요청을 오류로 후 (web.xml에 에러 페이지 규칙 등록)

4 DefaultErrorViewResolver

@Override
     공공 의 ModelAndView resolveErrorView (HttpServletRequest의 요청 HttpStatus 상태, 
            지도 <문자열, 개체> 모델) { 
        의 ModelAndView의 ModelAndView = 해결 (한 String.valueOf (상태), 모델);
        경우 (의 ModelAndView ==  && SERIES_VIEWS.containsKey (status.series ())) { 
            의 ModelAndView = 리졸 (SERIES_VIEWS.get (status.series ()), 모델); 
        } 
        반환 ModelAndView 활성화; 
    } 

    개인 의 ModelAndView 해결 (문자열 viewName과,지도 <문자열, 개체> 모델) {
         //기본 SpringBoot는 페이지를 찾아 갈 수 있나요? 오류 / 404 
        문자열 errorViewName = + "/ 오류" viewName과; 
        
        // 페이지 주소 템플릿 엔진 구문 분석 템플릿 엔진은 구문 분석 
        TemplateAvailabilityProvider 제공 = 다음은이 .templateAvailabilityProviders 
                .getProvider (errorViewName, 다음은이 .applicationContext),
         IF는 (! 제공 = null이 ) {
             // 반환 템플릿 엔진 주소 지정보기 errorViewName을 사용할 경우 
            반환  새로운 새 의 ModelAndView (errorViewName, 모델); 
        } 
        // 템플릿 엔진을 사용할 수없는 페이지 오류 /으로 404.html에 해당 errorViewName 정적 리소스 폴더를 찾을 수 
        반환 resolveResource (errorViewName, 모델); 
    }

단계 :

     그러나, 시스템 오류 4XX 5XX 등이 발생한다; ErrorPageCustomizer 효과 (정의 오류 응답 규칙)을 가지고 / 오류 요청 올 것이다한다 BasicErrorController가 처리된다.

     응답 페이지, 페이지가되는 DefaultErrorViewResolver 분석;

보호 의 ModelAndView resolveErrorView (HttpServletRequest의 요청, 
      HttpServletResponse를 응답, HttpStatus 상태,지도 <문자열, 개체> 모델) {
     // 所有的ErrorViewResolver得到의 ModelAndView 
   에 대한 (ErrorViewResolver 확인자 : .errorViewResolvers) { 
      의 ModelAndView의 ModelAndView = resolver.resolveErrorView (요청, 상태, 모델);
      경우 (!의 ModelAndView = 널 (null) ) {
          반환 의 ModelAndView를; 
      } 
   } 
   반환  널 (null)을 ; 
}

오류 페이지를 사용자 지정하는 방법

1. 템플릿 엔진의 경우가있다; 에러 / 상태 코드 , 오류 [폴더 안에 .html 중에서 템플릿 엔진 폴더 오류 페이지라는 오류 상태 코드가, 발생하는 대응이 오류 상태 코드가 올 페이지;

우리는 (정확한 상태 코드 들이게을 찾기 위해 우선 순위)이 형태, 정확한 우선 순위의 모든 오류와 일치하는 파일 이름으로 4XX, 5XX 및 오류 페이지를 사용할 수 있습니다;

페이지 정보를 얻을 수있다;

타임 스탬프 : 타임 스탬프

상태 : 상태 코드

오류 : 오류

예외 : 예외 객체

메시지 : 예외 메시지

오류 : JSR303 데이터 유효성 검사 오류가 여기에 있습니다

2) 어떤 템플릿 엔진 (템플릿 엔진은 오류 페이지), 찾을 수있는 정적 자원 폴더를 찾을 수 없습니다;

3) 위의 오류 페이지 중 어느 것도 기본 SpringBoot 기본 오류 페이지 온 없다;

오류 JSON 데이터를 사용자 지정하는 방법

1. 정의 및 예외 처리기 복귀 정의 데이터 JSON

@ControllerAdvice
 공공  클래스 MyExceptionHandler { 

    @ResponseBody 
    @ExceptionHandler (UserNotExistException. 클래스 )
     공공 지도 <문자열, 개체> handleException (예외 전자) { 
        지도 <문자열, 개체>지도 = 새로운 HashMap의 <> (); 
        map.put ( "코드", "user.notexist" ); 
        map.put ( "메시지" , e.getMessage ());
        반환 지도; 
    } 
}

2. / 오류 응답 적응 효과 처리부로 전달

@ExceptionHandler (. UserNotExistException 클래스 )
     공공 문자열 handleException (예외 E, HttpServletRequest의 요청) { 
        지도 <문자열, 개체> =지도 새로운 새 의 HashMap <> ();
         // 우리 자신의 오류 상태 코드 전달은 4XX 5XX, 또는 그들은하지 않습니다 지정 오류 페이지 파싱 과정을 입력 
        / ** 
         * 정수에 statusCode = (정수) 요청 
         .getAttribute ( "javax.servlet.error.status_code"); 
         * / 
        request.setAttribute ( "javax.servlet.error.status_code", 500 ) ; 
        map.put ( "코드", "user.notexist" ) 
        map.put ( "메시지" , e.getMessage ());
        /// 오류 전달하려면 
        반환 : "/ 오류 전달을" ; 
    }

우리는 사용자 정의 데이터를 수행한다

오류가 발생하면 / 오류 BasicErrorController 요청을 처리 할 것이다하려면, 응답 데이터가 얻어 아웃 getErrorAttributes 의해 획득 될 수있다 (소정의 방법 AbstractErrorController (ErrorController));

(1)의 전면 기입 ErrorController 용기에 넣고, [구현 클래스 또는 서브 클래스가 AbstractErrorController 제조];

2 페이지의 데이터가 될 수 있거나 errorAttributes.getErrorAttributes JSON 의해 얻어지는 데이터를 반환 할 수있다;

선박 DefaultErrorAttributes.getErrorAttributes () 기본 데이터 처리부;

사용자 정의 ErrorAttributes

// 给容器中加入我们自己定义的ErrorAttributes 
@Component
 공공  클래스 MyErrorAttributes는 확장 DefaultErrorAttributes { 

    @Override 
    공개 지도 <문자열, 개체> getErrorAttributes (RequestAttributes의 requestAttributes, 부울 includeStackTrace) { 
        지도 <문자열, 개체>지도 = 슈퍼 .getErrorAttributes (requestAttributes를 , includeStackTrace); 
        map.put ( "회사", "atguigu" );
        반환 지도; 
    } 
}

 

추천

출처www.cnblogs.com/xiaoqiqistudy/p/11366415.html