springmvc 사용자 정의 이상 통일 처리

7967 단어 Exception
springmvc는 HandlerExceptionResolver 인터페이스를 제공하여 이상을 통일적으로 처리할 수 있습니다.springmvc는 Handler Exception Resolver 인터페이스를 실현하는 몇 가지 종류가 있는데 이상을 처리합니다. 우리는 원본 코드를 참조하여 사용자 정의 이상을 통일적으로 처리할 수 있습니다.

1. springmvc가 HandlerExceptionResolver 인터페이스를 실현하는 클래스

  • Default Handler Exception Resolver, 웹에 따라.xml 상태 설정은 이상을 상응하는 상태 코드로 직접 전환하여 상응하는 이상 처리 페이지로 이동합니다..
  • AnnotationMethodHandlerExceptionResolver는 @ExceptionHandler와 같은 주석을 통해 이상을 처리할 수 있습니다
  • SimpleMappingExceptionResolver는springmvc에서 제공하는 간단한 이상 통일 처리로 스프링 프로필에 설정해야 합니다. 예를 들어:
  • <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
          
        <property name="defaultErrorView" value="error">property>  
          
        <property name="exceptionAttribute" value="ex">property>  
          
        <property name="exceptionMappings">  
            <props>  
                <prop key="com.simple.exception.ServiceException">error-serviceprop>    
            props>  
        property>  
    bean>

    2. 사용자 정의 이상 통일 처리


    1. 새 MyExceptionHandler 사용자 정의 이상 통합 클래스
    package com.simple.exception;
    
    import java.io.IOException;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.util.StringUtils;
    import org.springframework.web.HttpRequestMethodNotSupportedException;
    import org.springframework.web.servlet.HandlerExceptionResolver;
    import org.springframework.web.servlet.ModelAndView;
    
    public class MyExceptionHandler implements HandlerExceptionResolver{
        private final Logger log = LoggerFactory.getLogger(this.getClass());
        @Override
        public ModelAndView resolveException(HttpServletRequest request,
                HttpServletResponse response, Object handler, Exception ex) {
    
            if (ex instanceof HttpRequestMethodNotSupportedException) {
                try {
                    return handleHttpRequestMethodNotSupported((HttpRequestMethodNotSupportedException) ex, request,
                            response, handler);
                } catch (IOException e) {
                    log.error("RequestMethodNotSupported ", e);
                }
            }
            String uri = request.getRequestURI();
            log.error(" :" + uri);
            log.error(" :", ex);
            // , 
            if (null != uri && uri.contains("/appwap")) {
                return new ModelAndView("error/appwap-500");
            }else if (null != uri && uri.contains("/pcweb")){
                return new ModelAndView("error/pcweb-500");
            }
            return null;
        }
    
        /**
         *  DefaultHandlerExceptionResolver RequestMethod 
         *  RequestMethod , RequestMethod , HEAD ,MyExceptionHandler 
         *  , warn 
         * @param ex
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws IOException
         */
        protected ModelAndView handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException ex,
                HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
    
            log.warn(ex.getMessage());
            String[] supportedMethods = ex.getSupportedMethods();
            if (supportedMethods != null) {
                response.setHeader("Allow", StringUtils.arrayToDelimitedString(supportedMethods, ", "));
            }
            response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, ex.getMessage());
            return new ModelAndView();
        }
    }
    
    2.spring xml 
    
    ```xml
    "myExceptionHandler" class="com.simple.exception.MyExceptionHandler">
    

    3. 테스트 결과 2017-09-17 15:45:19 [com.simple.exception.MyExceptionHandler]-[ERROR] 이상 요청 경로:/test/hello 2017-09-17 15:45:19 [com.simple.exception.MyExceptionHandler]-[ERROR] 이상 정보:java.lang.Exception: 사용자 정의 이상 처리atcom.simple.controller.HelloWorldController.hello(HelloWorldController.java:22) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ……

    좋은 웹페이지 즐겨찾기