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에 에러 페이지 규칙 등록)
@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 효과 (정의 오류 응답 규칙)을 가지고 / 오류 요청 올 것이다한다
보호 의 ModelAndView resolveErrorView (HttpServletRequest의 요청, HttpServletResponse를 응답, HttpStatus 상태,지도 <문자열, 개체> 모델) { // 所有的ErrorViewResolver得到의 ModelAndView 에 대한 (ErrorViewResolver 확인자 : 이 .errorViewResolvers) { 의 ModelAndView의 ModelAndView = resolver.resolveErrorView (요청, 상태, 모델); 경우 (!의 ModelAndView = 널 (null) ) { 반환 의 ModelAndView를; } } 반환 널 (null)을 ; }
1. 템플릿 엔진의 경우가있다; 에러 / 상태 코드 ,
우리는 (정확한 상태 코드 들이게을 찾기 위해 우선 순위)이 형태, 정확한 우선 순위의 모든 오류와 일치하는 파일 이름으로 4XX, 5XX 및 오류 페이지를 사용할 수 있습니다;
페이지 정보를 얻을 수있다;
타임 스탬프 : 타임 스탬프
상태 : 상태 코드
오류 : 오류
예외 : 예외 객체
메시지 : 예외 메시지
오류 : JSR303 데이터 유효성 검사 오류가 여기에 있습니다
2) 어떤 템플릿 엔진 (템플릿 엔진은 오류 페이지), 찾을 수있는 정적 자원 폴더를 찾을 수 없습니다;
3) 위의 오류 페이지 중 어느 것도 기본 SpringBoot 기본 오류 페이지 온 없다;
@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" ); 반환 지도; } }