Spring 글로벌 예외 처리의 세 가지 방법 이해

9201 단어 spring이상
J2EE 프로젝트의 개발에서 밑바닥의 데이터베이스 조작 과정이든 업무층의 처리 과정이든 통제층의 처리 과정이든 각종 예측할 수 있고 예측할 수 없는 이상 처리를 피할 수 없다.모든 과정은 단독으로 이상을 처리하고 시스템의 코드 결합도가 높으며 작업량이 많고 통일되지 않으며 유지 보수의 작업량도 매우 크다.그러면 모든 유형의 이상 처리를 각 처리 과정에서 결합시킬 수 있습니까? 이렇게 하면 관련 처리 과정의 기능이 비교적 단일할 뿐만 아니라 이상 정보의 통일된 처리와 유지도 실현할 수 있습니까?답은 긍정적이다.Spring MVC를 사용하여 예외 해결 및 구현 프로세스를 통합
  • Spring MVC에서 제공하는 SimpleMappingExceptionResolver 를 사용합니다
  • Spring의 이상 처리 인터페이스를 실현하는 HandlerExceptionResolver는 자신의 이상 프로세서를 사용자 정의합니다
  • @ExceptionHandler 메모를 사용하여 이상 처리를 수행합니다
  • (1) SimpleMappingExceptionResolver
    이런 방식을 사용하면 통합이 간단하고 좋은 확장성, 기존 코드에 대한 침입성이 없다는 장점이 있지만 이 방법은 이상 정보만 얻을 수 있고 이상이 발생할 때 이상을 제외한 데이터를 얻어야 하는 경우에는 적용되지 않는다.
    
    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = {"com.balbala.mvc.web"})
    public class WebMVCConfig extends WebMvcConfigurerAdapter{
     @Bean
      public SimpleMappingExceptionResolver simpleMappingExceptionResolver()
      {
        SimpleMappingExceptionResolver b = new SimpleMappingExceptionResolver();
        Properties mappings = new Properties();
        mappings.put("org.springframework.web.servlet.PageNotFound", "page-404");
        mappings.put("org.springframework.dao.DataAccessException", "data-access");
        mappings.put("org.springframework.transaction.TransactionException", "transaction-Failure");
        b.setExceptionMappings(mappings);
        return b;
      }
    }
    (2) HandlerExceptionResolver
    첫 번째에 비해 HandlerExceptionResolver는 정의된 이상 처리 페이지를 정확하게 표시하여 통일 이상 처리의 목표를 달성할 수 있다
    1. 클래스를 정의하여 HandlerExceptionResolver 인터페이스를 실현하고 이번에는 자신의 이전 코드를 붙인다
    
    package com.athena.common.handler;
    import com.athena.common.constants.ResponseCode;
    import com.athena.common.exception.AthenaException;
    import com.athena.common.http.RspMsg;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.servlet.HandlerExceptionResolver;
    import org.springframework.web.servlet.ModelAndView;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    /** 
     * Created by sam on 15/4/14. 
     */
    public class GlobalHandlerExceptionResolver implements HandlerExceptionResolver {  
     private static final Logger LOG = LoggerFactory.getLogger(GlobalHandlerExceptionResolver.class);         
      /**   
      *     
      */  
      @Override  
      public ModelAndView resolveException(HttpServletRequest req,                     HttpServletResponse resp, Object o, Exception ex) {  
        ex.printStackTrace();   
        if (ex instanceof AthenaException) {  
          //AthenaException 
          ex.printStackTrace();     
          printWrite(ex.toString(), resp);   
          return new ModelAndView(); 
        }  
        //RspMsg  
        //ResponseCode 
        RspMsg unknownException = null;   
        if (ex instanceof NullPointerException) {    
          unknownException = new RspMsg(ResponseCode.CODE_UNKNOWN, " ", null);
        } else {     
          unknownException = new RspMsg(ResponseCode.CODE_UNKNOWN, ex.getMessage(), null);    }   
          printWrite(unknownException.toString(), resp);  
          return new ModelAndView();  
      } 
    
      /**   
      *  response    
      *   
      * @param msg   
      * @param response   
      * @throws IOException   
      */  
      public static void printWrite(String msg, HttpServletResponse response) {   
         try {      
           PrintWriter pw = response.getWriter();    
           pw.write(msg);    
           pw.flush();    
           pw.close();   
         } catch (Exception e) {     
           e.printStackTrace();   
         }  
      }
    }
    
    
    2. 스프링 설정에 추가, 여기에 관련 부분만 붙였습니다
    
    import com.athena.common.handler.GlobalHandlerExceptionResolver;
    import org.springframework.context.annotation.Bean;
    import com.athena.common.handler.GlobalHandlerExceptionResolver;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    /** 
     * Created by sam on 15/4/14. 
     */
    public class WebSpringMvcConfig extends WebMvcConfigurerAdapter {
    
      @Bean
      public GlobalHandlerExceptionResolver globalHandlerExceptionResolver() {
       return new GlobalHandlerExceptionResolver();
      }
    }
    
    
    (3) @ExceptionHandler
    이것은 필자의 현재 항목의 사용 방식이며, 여기에도 관련 부분만 붙였다
    1. 먼저 부류를 정의하고 기초적인 방법을 실현한다
    
    package com.balabala.poet.base.spring;
    import com.google.common.base.Throwables;
    import com.raiyee.poet.base.exception.MessageException;
    import com.raiyee.poet.base.utils.Ajax;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.core.annotation.AnnotationUtils;
    import org.springframework.http.HttpStatus;
    import org.springframework.web.bind.annotation.ResponseStatus;
    import org.springframework.web.servlet.ModelAndView;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Date;
    
    public class BaseGlobalExceptionHandler {  
       protected static final Logger logger = null;  
       protected static final String DEFAULT_ERROR_MESSAGE = " , "; 
    
       protected ModelAndView handleError(HttpServletRequest req, HttpServletResponse rsp, Exception e, String viewName, HttpStatus status) throws Exception {  
         if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)    
         throw e;   
         String errorMsg = e instanceof MessageException ? e.getMessage() : DEFAULT_ERROR_MESSAGE;    
         String errorStack = Throwables.getStackTraceAsString(e);  
    
         getLogger().error("Request: {} raised {}", req.getRequestURI(), errorStack);    
         if (Ajax.isAjax(req)) {    
           return handleAjaxError(rsp, errorMsg, status);  
         }    
         return handleViewError(req.getRequestURL().toString(), errorStack, errorMsg, viewName); 
       }  
    
       protected ModelAndView handleViewError(String url, String errorStack, String errorMessage, String viewName) {    
         ModelAndView mav = new ModelAndView();    
         mav.addObject("exception", errorStack);    
         mav.addObject("url", url);   
         mav.addObject("message", errorMessage); 
         mav.addObject("timestamp", new Date());    
         mav.setViewName(viewName);  
         return mav;  
        }  
    
       protected ModelAndView handleAjaxError(HttpServletResponse rsp, String errorMessage, HttpStatus status) throws IOException {    
          rsp.setCharacterEncoding("UTF-8");    
          rsp.setStatus(status.value());   
          PrintWriter writer = rsp.getWriter();
          writer.write(errorMessage);    
          writer.flush();    
          return null;  
       }  
    
       public Logger getLogger() {    
          return LoggerFactory.getLogger(BaseGlobalExceptionHandler.class);
       } 
    }
    
    
    2. 당신이 포착해야 할 이상에 대응하는 처리 방식
    
    package com.balabala.poet.base.spring;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.http.HttpStatus;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseStatus;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.NoHandlerFoundException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    @ControllerAdvice
    public class GlobalExceptionHandler extends BaseGlobalExceptionHandler {  
    
       // 404 
       @ExceptionHandler(NoHandlerFoundException.class)  
       @ResponseStatus(HttpStatus.NOT_FOUND)  
        public ModelAndView handle404Error(HttpServletRequest req, HttpServletResponse rsp, Exception e) throws Exception {  
           return handleError(req, rsp, e, "error-front", HttpStatus.NOT_FOUND);  
        }  
    
       //500 
       @ExceptionHandler(Exception.class)   
       @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 
       public ModelAndView handleError(HttpServletRequest req, HttpServletResponse rsp, Exception e) throws Exception { 
           return handleError(req, rsp, e, "error-front", HttpStatus.INTERNAL_SERVER_ERROR); 
       }  
    
       //TODO  
       //TRY NOW!!!
    
       @Override  
       public Logger getLogger() {   
          return LoggerFactory.getLogger(GlobalExceptionHandler.class);  
       }
    
     }
    
    
    이상은 세 가지 처리 방식입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

    좋은 웹페이지 즐겨찾기