SpringBoot 전역 이상 처리 및 404 페이지 맞 춤 형 방법
SpringBoot 를 사용 하여 만 든 웹 프로젝트 에서 요청 한 페이지 가 존재 하지 않 거나(http 상태 코드 404)이상(http 상태 코드 보통 500)이 발생 하면 SpringBoot 는 오류 정 보 를 되 돌려 줍 니 다.
즉,SpringBoot 의 웹 프로젝트 에 서 는 오류 정 보 를 되 돌려 주 는/error 의 오류 인 터 페 이 스 를 자동 으로 만 듭 니 다.그러나 서로 다른 방문 방식 에 대해 다음 과 같은 두 가지 서로 다른 반환 정보 가 있 을 것 이다.이것 은 주로 당신 이 방문 할 때의 http 머리 정보
Accept
에 달 려 있 습 니 다.이 값 은 당신 이 받 을 수 있 는 유형 이 어떤 것 인지 지정 합 니 다.브 라 우 저 를 사용 하여 접근 할 때의 헤더 정보 및 반환 결과
Accept: text/html
다른 장 치 를 사용 합 니 다.예 를 들 어 핸드폰 클 라 이언 트 등 이 방문 할 때 머리 정보 와 그 반환 결과(보통 앞 뒤 가 분 리 된 구조 에서)
Accept: */*
2.오류 처리
처리 이상 은 주로 두 가지 방식 이 있 습 니 다.
1.SpringBoot 의 자동 설정 원 리 를 사용 하여 이상 처리
SpringBoot 는 이상 처 리 를 위 한 클래스
ErrorMvcAutoConfiguration
를 자동 으로 설정 합 니 다.관심 있 는 것 은 보 셔 도 됩 니 다.그리고 이 클래스 에서 잘못된 Basic ErrorController 클래스 를 정의 합 니 다.주요 코드 는 다음 과 같 습 니 다.
@Controller
@RequestMapping({"${server.error.path:${error.path:/error}}"})
public class BasicErrorController extends AbstractErrorController {
/**
*
*/
@RequestMapping(produces = {"text/html"})
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
HttpStatus status = this.getStatus(request);
Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.TEXT_HTML)));
response.setStatus(status.value());
// modelAndView
ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);
return modelAndView != null ? modelAndView : new ModelAndView("error", model);
}
/**
* json
*/
@RequestMapping
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
HttpStatus status = this.getStatus(request);
if (status == HttpStatus.NO_CONTENT) {
return new ResponseEntity(status);
} else {
Map<String, Object> body = this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.ALL));
return new ResponseEntity(body, status);
}
}
많은 코드 는 깊이 연구 하지 않 으 니 관심 있 는 것 은 가서 볼 수 있다.위의 코드 는 서로 다른 요청 방식 에 대해 서로 다른 결 과 를 되 돌려 주 는 것 이다.그 관건 은 @RequestMapping
주해 의produces = {"text/html"}
속성 에 있다.1)404,500 등 오류 페이지 를 되 돌려 줍 니 다.
템 플 릿 엔진 이 있 는 경우(페이지 렌 더 링 에 사용 가능)
프로젝트 에 사 용 된 템 플 릿 엔진,예 를 들 어 thymeleaf,freemarker 등 이 페이지 로 렌 더 링 할 때.templates 에서/error 폴 더 를 만 들 고 잘못된 상태 코드 에 대응 하 는.html 파일 을 추가 합 니 다.다음 그림:
여기 서 404 와 500 은 정확 한 오류 상태 코드 이 고 4xx 는 400,401 등 다른 4 개의 시작 오 류 를 나타 낸다.물론 모든 상태 코드 에 대응 하 는 오류 페이지 를 설정 할 수 있 지만 이렇게 하면 좋 을 것 이 없 기 때문에 4xx.html 와 같은 범 지 를 직접 사용 하여 대체 합 니 다.
저희 오류 페이지 에서 다음 과 같은 정 보 를 얻 을 수 있 습 니 다(바로 Model AndView 대상 의 내용 입 니 다).
필드 이름
설명 하 다.
timstamp
타임 스탬프
status
오류 상태 코드
error
오류 알림
exception
이상 개체
message
이상 한 소식
path
페이지 경로
세심 한 동료 들 은 이것 이 사실 휴대 전화 로 요청 할 때 돌아 오 는 제 이 슨 의 내용 이라는 것 을 알 게 될 것 이다.
예 를 들 어 코드 에 상단 정 보 를 추가 한 다음 백 엔 드 에 오류 코드 를 작성 합 니 다.
@RequestMapping("haserror")
@ResponseBody
public Object myError(){
int i =10/0;
return "something is error";
}
:
<ul>
<li> :[[${status}]]</li>
<li> :[[${error}]]</li>
<li> :[[${exception}]]</li>
<li> :[[${message}]]</li>
<li> :[[${timestamp}]]</li>
</ul>
템 플 릿 엔진 이 없 는 경우
프로젝트 에 템 플 릿 엔진 을 사용 하지 않 았 을 때 전체 error 폴 더 를 static 폴 더 아래로 옮 기 면 됩 니 다.
그러나 이 때 는 위의 정 보 를 얻 을 수 없습니다.이것 은 정적 자원 이기 때문에 템 플 릿 엔진 이 렌 더 링 을 하지 않 습 니 다.
2)、대응 하 는 json 문자열 되 돌리 기
이것 은 결코 할 말 이 없다.돌아 오 는 것 은 제 이 슨 문자열 이다.형식 은 다음 과 같 습 니 다.
{
"timestamp": "2020-04-22T16:13:37.506+0000",
"status": 500,
"error": "Internal Server Error",
"message": "/ by zero",
"path": "/hello/haserror",
"reason": " , "
}
3)사용자 정의 페이지 반환 정보이것 이 야 말로 가장 중요 한 내용 이다.왜냐하면 이 정 보 는 제 이 슨 으로 돌아 갈 뿐만 아니 라 위의 오류 페이지 에서 도 얻 을 수 있 고 제 이 슨 으로 돌아 갈 수 있 기 때문이다.사실 아주 간단 합 니 다.바로 Spring 용기 에 하나의
ErrorAttributes
대상 을 추가 하면 됩 니 다.여기 서 저 는 그것 을 계승 하 는 키 종 류 를 선택 하 겠 습 니 다.
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
// , , ,
Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace);
//
errorAttributes.put("reason"," , ");
// webRequest ,
return errorAttributes;
}
}
이 사용자 정의 속성 이 사용 가능 한 지 두 가지 요청 방식 으로 각각 테스트 합 니 다.2.AOP 의 이상 알림 으로 처리(추천)
그것 의 원 리 는 전체적인 이상 통 지 를 받 은 후에 처리 하 는 것 이다.저 희 는 프로젝트 에 다음 코드 만 쓰 면 됩 니 다.
@ControllerAdvice
public class ErrroAcvice {
/**
*
* @param request ,
* @param response ,
* @param e ( )
*/
@ExceptionHandler(Exception.class) //
public void errorHandler(HttpServletRequest request, HttpServletResponse response,Exception e){
/*
* You can do everything you want to do
* request response ,
* :
* 1. request Accept
* 2. , response
* 3.
*/
String accept = request.getHeader("Accept");
//
try {
response.setStatus(500);
response.getWriter().write("hello");
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
3.두 가지 방법 비교:첫 번 째 방법 은 현재 프로젝트 에 잘못된 상태 코드 를 설치 한 페이지 를 SpringBoot 에서 찾 도록 하 는 것 입 니 다.사용자 정의 로 되 돌아 오 는 오류 정 보 를 지원 하 는 두 번 째 방법 은 AOP 의 사상 을 직접 사용 하여 이상 알림 처 리 를 하 는 것 으로 자유 성 이 크다.저 는 개인 적 으로 두 번 째 방법 을 사용 할 것 을 건의 합 니 다.자유도 가 높 기 때문에 자신의 업무 논리 에 따라 수시로 바 꿀 수 있 고 큰 용도 도 있 습 니 다.다음 글 은 두 번 째 방식 을 사용 한 후 첫 번 째 방식 으로 설 치 된 오류 페이지 와 사용자 정의 오류 정 보 를 모두 무효 화 하 는 좋 은 예 가 있 을 것 입 니 다.스프링 부 트 전역 이상 처리 와 404 페이지 를 맞 춤 형 으로 만 드 는 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.스프링 부 트 전역 이상 처리 내용 에 대해 서 는 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.