이상과 컨트롤러 레이어의 통합 처리 창

이상과 컨트롤러 레이어 창 (1)의 통합 처리
비정상적인 통합 처리 컨트롤러 레이어 및 창 (2)
비정상 통합 처리 컨트롤러 레이어 반환
우선하는 이유는 무엇입니까?
당신은 일반적으로 최초의 반응은 시도 - 캐치 캐치 예외를 사용하는 방법에 대한 생각하면, 예외이 과정을 던지는 방법을 발견 할 때 컨트롤러 레이어 인터페이스를 서면으로 몰라?
당신이 컴파일 검사에 시도 - 캐치를 통과하지 못한, 그래서 당신은 이상을 캡처하는 이니셔티브를 취할 수 있지만,이 거래는 컴파일러의 종류에만 적합하기 때문에 비정상적인, 자동 검사 및 처리를 생각 나게 해요. 이 런타임 예외이며, 그러나, 당신은 무슨 일이 일어날 처리하는 시간이 생각하는 시간이 없었어요? 이 런타임 처리 예를 들어 다음과 같은 특별하지 않다에서 우리는 볼 수 있습니다
@RestController
공용 클래스 ExceptionRest {
@GetMapping ( "getNullPointerException")
공개지도 <문자열, 개체> getNullPointerException () {
던져 새로운 새로운 NullPointerException가 ( "널 포인터가 있었다 예외 ");
}
}

출시 후 Tomcat을 사용하여 받는다는 SpringMVC 프로젝트를 기반으로 위의 코드에서, 브라우저는 다음과 같은 요청을 시작합니다 :
HTTP : // localhost를 : 8080 / zxtest / getNullPointerException의
방문이 인 결과 후 :

브라우저 오류 메시지를 수신

당신은 우리가 널 포인터 예외를 발생하고, 프런트 엔드 브라우저로 돌아갑니다 예외 스택 결과, 사용자는 아주 나쁜 경험을 생성, 컨트롤러 인터페이스 층에서 잡은되지 볼 수 있습니다.
또한, 오류 메시지의 프런트 엔드 서버에서 볼 수 있습니다 및 미들웨어의 종류, 프레임 정보와 사용되는 정보의 유형을 사용하여 백엔드 시스템은 백 엔드 SQL 예외가 발생하더라도, 당신은 또한 SQL 예외를 볼 수 있습니다 중간 위험 보안 취약점 인 매개 변수에 대한 자세한 내용은 특정 메시지는 복구해야합니다.
추신 : 항목 위, 다음 SpringBoot 자동 오류가 거래를 할 내용을 반환하기 때문에 SpringBoot가, 전면에있는 정보를 제공 할 수 없습니다 사용하는 경우, 우리는 더 복잡한 시나리오는 이제 메이븐 웹 템플릿을 사용하는 경우에만 SpringMVC를 포함하는 프로젝트를 생성해야합니다.
둘째, 어떻게 통합 치료를합니까?
시간을 실행할 때 이상이 발생하면 다음과 같이 우리가 아마 생각하는 가장 쉬운 방법은, 예외 처리와 코드에 대한 예외를 던질 수
@RestController
공용 클래스 ExceptionRest {
개인 로거의 로그 = LoggerFactory.getLogger ( ExceptionRest.class)
@GetMapping ( "getNullPointerException")
공개지도 <문자열, 개체> getNullPointerException는 () {
;지도 = 새로운 새로운 returnMap HashMap의 <문자열, 개체> ()는 <문자열, 개체>는
은 try {
"표시합니다 (NullPointerException이 새로운 새를 던져 널 포인터 예외 ");
캐치} (는 NullPointerException E) {
log.error (E "널 포인터 예외가 발생했습니다");
returnMap.put이 (false로 "성공")
. returnMap.put ( "중 mesg", "예외 요청을 다시 시도하십시오 테스트 ");
}
반환 returnMap입니다;
}
}

: 우리가 수동으로 던져와 장소 플러스 처리 및 적절한 반환 비정상적인 내용의 전면에 수익을 발생하기 때문에, 따라서 우리가 다시 브라우저에서 동일한 요청 시작할 때 다음을 얻을 수 있습니다
{
성공 : 거짓
은 mesg : "비정상적인 요청 나중에 다시 시도하십시오"
}

해결 된 문제 같은데,하지만 당신은 당신이 방금 발생과 처리 수있는 모든 장소 예외의 예외를 캡처 한 수 있는지 확인 할 수 있습니까? 당신은 다른 사람의 팀이 그렇게 할 수 있도록 할 수 있습니까?
물론, 당신은 치료 프로그램 잡히면 통일 예외가 필요합니다.
2.1 HandlerExceptionResolver 사용하여
통합 된 웹 기반의 예외 처리를 달성하고 스프링 설정 파일에 등록 된 그 종류대로 결과 던져 컨트롤러 층을 반환, 우리가 여기있는 모든 구성 예외를 포착 할 수있을 것이라고 HandlerExceptionResolver가 예외 핸들러 인터페이스입니다.
2.1.1 기본 사용

방법 1 : HttpServletResponse를 반환 JSON 정보를 사용하여

@Controller
공용 클래스 WebExceptionResolver는 HandlerExceptionResolver {구현
개인 로거의 로그 = LoggerFactory.getLogger (WebExceptionResolver.class를);
@Override
공공의 ModelAndView resolveException (HttpServletRequest의 HttpServletRequest의, HttpServletResponse를 HttpServletResponse를, 개체 O, 예외 전자) {
log.error ( "请求{}发生异常!", httpServletRequest.getRequestURI ());
의 ModelAndView MV = 새의 ModelAndView ();
httpServletResponse.setContentType ( "애플리케이션 / JSON; 문자셋 = UTF-8");
httpServletResponse.setCharacterEncoding ( "UTF-8");
문자열 retStr = "{"성공 "거짓"MSG ":"请求异常,请稍后再试"}";
{시도
httpServletResponse.getWriter ()을 (retStr)를 작성합니다.;
} 캐치 (예외 예) {
log.error ( "WebExceptionResolver 예외 처리", EX);
}
// 필요가 다른 프로세서가 계속 탈선의 ModelAndView를 캡처 할 방지하기 위해 빈으로 돌아갑니다
반환 뮤직 비디오를;
}
}

위의 과정을 통해, 모든 예외는 WebExceptionResolver 웹 계층 캡처 resolveException 처리는 다음 정보를 반환 HttpServletResponse를 통일하는 데 사용하고 반환 할 수 할 수 있습니다. 다음은 브라우저의 내용에 동일한 링크를 반환하는 요청입니다 :

메시지 차단 웹 이상을 반환

두 번째 방법 : ModelAndView를 반환 JSON 정보를 사용하여

@Controller
공용 클래스 WebExceptionResolver는 HandlerExceptionResolver {구현
개인 로거의 로그 = LoggerFactory.getLogger (WebExceptionResolver.class를);
@Override
공공의 ModelAndView resolveException (HttpServletRequest의 HttpServletRequest의, HttpServletResponse를 HttpServletResponse를, 개체 O, 예외 전자) {
log.error ( "请求{}发生异常!", httpServletRequest.getRequestURI ());
의 ModelAndView MV = 새의 ModelAndView (새 MappingJackson2JsonView ());
mv.addObject ( "성공", "거짓");
mv.addObject ( "중 mesg", "请求异常,请稍后再试");
MV를 반환;
}
}

동일한이 두 효과는, 유일한 차이점은 제 2 실시 예는 다수의 사용 잭슨 데이터 바인딩 패키지를 도입하는 것이 필요하다.

com.fasterxml.jackson.core
잭슨 - 더 데이터 바인딩

2.1.2 특정 예외 처리
때때로 우리는 당신은 개별적으로 캡처 할 수있는 예외 처리의 유형을 결정해야합니다, 특정 이상의 경우에 어떤 처리를 수행해야합니다
@Controller
공용 클래스를 WebExceptionResolver 구현하는 HandlerExceptionResolver {
개인 로거의 로그 = LoggerFactory.getLogger (WebExceptionResolver.class)
@Override
공공의 ModelAndView resolveException (HttpServletRequest의 HttpServletRequest의, HttpServletResponse를 HttpServletResponse를, 개체 O, 예외 E) {
log.error ( "{} 예외 요청이 발생!", HttpServletRequest.getRequestURI ());
의 ModelAndView는 = 뮤직 비디오 새로운 새의 ModelAndView (새 새 MappingJackson2JsonView ());
mv.addObject ( "false로" "성공");
IF (NullPointerException이 instanceof를 E) {
mv.addObject ( "중 mesg", "널 포인터 예외 요청이 발생 나중에 다시 시도하십시오") ;
}는 다른 (ClassCastException이 instanceof를 E) {IF
mv.addObject ( "중 mesg", "형식 변환 예외 요청이 나중에 다시 시도하십시오 발생");
}는 다른 {
( "나중에 다시 시도하십시오, 예외 요청이 발생", "중 mesg") mv.addObject를;
}
반환 뮤직 비디오;
}
}

2.1.3 예외 처리 체인
예외 클래스가 존재 HandlerExceptionResolver 이상의 구현은, 그들은 문 앞에 프로파일이 경우를 전처리, 후 처리, 더 스프링 선언 처리 체인을 형성한다면 제 1 처리 클래스 예외 처리되지 후속 프로세서를 차단할 수있는 더 많은 예외 처리, 또는.
PS : 당신이 더 다른 프로세서에 의해 밖으로 던져 방지하기 위해, 현재의 예외 핸들러에서 예외를 차단하려는 경우 다음 직접 마지막 반환에 빈의 ModelAndView 객체가 될 수 있습니다. 이 예외를 차단하지 않으려면, 다음은 null을 반환 할 수 있습니다, 다른 프로세서를 수 있도록 계속합니다.
// 다른 프로세서 캡처 계속 비정상의 ModelAndView 방지하기 위해 빈 반환해야
반환 MV를;
// 반환 예외 처리를 계속할 수 이상, 다른 프로세서를 차단하지 않습니다 널 (null)
는 null을;

2.2 @ExceptionHandler
Spring3.2, SpringMVC 후보다 쉽고 정확한 예외 처리를 위해 만드는, ExceptionHandler 접근 방식을 도입, 당신이해야 할 유일한 것은 새로운 컨트롤러를 만드는 것입니다, 다음 내부를 두 음을 완료하는 데에 모든 예외를 캡처 및 프로세스 컨트롤러 층.
2.2.1 기본 사용은
새로운 컨트롤러는 다음과 같습니다
@ControllerAdvice
공용 클래스 ExceptionConfigController {
@ExceptionHandler
exceptionHandler (예외 E)에서 공공의 ModelAndView {
의 ModelAndView 뮤직 비디오 새로운 새의 ModelAndView = (새 새 MappingJackson2JsonView을 ());
(false로 "성공") mv.addObject를,
뮤직 비디오를 .addObject ( "중 mesg", "예외 요청이 나중에 다시 시도하십시오 발생");
뮤직 비디오를 반환;
}
}

우리는이 예외가 있음을 나타냅니다 그 다음 @ExceptionHandler 메모를 추가 exceptionHandler 방법, 객체의 ModelAndView 수익을 생성하는 컨트롤러의 향상된 버전임을 나타내는 @ControllerAdvice 클래스 노트 코드 위에있는 플러스 처리 방법은 다음 특정 예외 처리 로직 및 반환 매개 변수가 너무 정말 너무 편리하고, 모든 작업을 완료하기 위해, 할 수있는 방법을 쓰기.
우리는 다음과 같은 결과를 전화를 개시 한 후 브라우저로 돌아가 :
{
성공 : 거짓,
중 mesg을 "요청 예외가 나중에 다시 시도하십시오 발생했습니다"
}

2.2 특정 처리 예외
비해 다양한 이상 더 유연한 처리 @ExceptionHandler하여, 각각에 대하여 HandlerExceptionResolver. 특정 예외를 제외하고 하위 발생 될 때, 여전히 캡쳐되고 처리 될 수있다.
: 우리는 컨트롤러 계층에서의 코드는 다음과 변경
@RestController
공용 클래스 ExceptionController을 {

@GetMapping("getNullPointerException")
public Map<String, Object> getNullPointerException() {
    throw new NullPointerException("出现了空指针异常");
}

@GetMapping("getClassCastException")
public Map<String, Object> getClassCastException() {
    throw new ClassCastException("出现了类型转换异常");
}

@GetMapping("getIOException")
public Map<String, Object> getIOException() throws IOException {
    throw new IOException("出现了IO异常");
}

}

ClassCastException이 NullPointerException가 알려진 RuntimeException을 상속하고, RuntimeException을하고 IOException이이 예외를 상속합니다.
우리는 공정 ExceptionConfigController에서이 작업을 수행 :
@ControllerAdvice
ExceptionConfigController가 {공용 클래스
// 과정 NullPointerException이 컨트롤러 계층 캡처하도록 설계
@ExceptionHandler (NullPointerException.class)
공공의 ModelAndView nullPointerExceptionHandler (는 NullPointerException E) {
의 ModelAndView 뮤직 비디오 새로운 새의 ModelAndView = (새 새를 MappingJackson2JsonView ());
mv.addObject () false로 "성공";
mv.addObject ( "중 mesg", "널 포인터 예외 요청이 발생 나중에 다시 시도하십시오");
뮤직 비디오를 반환;
}

// 专门用来捕获和处理Controller层的运行时异常
@ExceptionHandler(RuntimeException.class)
public ModelAndView runtimeExceptionHandler(RuntimeException e){
    ModelAndView mv = new ModelAndView(new MappingJackson2JsonView());
    mv.addObject("success",false);
    mv.addObject("mesg","请求发生了运行时异常,请稍后再试");
    return mv;
}

// 专门用来捕获和处理Controller层的异常
@ExceptionHandler(Exception.class)
public ModelAndView exceptionHandler(Exception e){
    ModelAndView mv = new ModelAndView(new MappingJackson2JsonView());
    mv.addObject("success",false);
    mv.addObject("mesg","请求发生了异常,请稍后再试");
    return mv;
}

}

그때

우리는 컨트롤러 레이어의 NullPointerException이 던질 때 nullPointerExceptionHandler 후 처리를 차단한다.
{
성공 : 거짓으로
중 mesg : "널 포인터 예외 요청은 나중에 다시 시도하십시오 발생"
}

우리는 컨트롤러 레이어의 ClassCastException를 던질 때 runtimeExceptionHandler 후 처리를 차단한다.
{
: 거짓에 성공
중 mesg : "예외 요청이 발생, 나중에 실행 다시 시도하십시오"
}

우리는 컨트롤러 층 IOException가 던질 때, exceptionHandler, 다음 차단을 처리됩니다.
{
: 거짓에 성공
중 mesg : "예외 요청이 발생 나중에 다시 시도하십시오"
}

셋째, 요약
SpringMVC 예외 처리 우리에게 제공 컨트롤러 층, 정말 너무 편리 특히 @ExceptionHandler, 우리는 사용하는 것이 좋습니다.

저자 : 힘의 양
링크 : https://www.jianshu.com/p/d3fd250db622
출처 : 제인 책
저자가 보유 제인 책의 저작권은, 어떤 형태로도 복제되어, 승인을 얻기 위해 작성자에게 문의하고 소스를 표시하시기 바랍니다.

추천

출처blog.csdn.net/wcc178399/article/details/91143165