Spring 统一管理输出

使用  @ControllerAdvice  和 @ExceptionHandler 赞成处理 (注解可扫描的地方)java

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.ConversionNotSupportedException;
import org.springframework.beans.TypeMismatchException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import com.wuage.ossserver.common.model.ReturnFormat;

@ControllerAdvice  
@EnableWebMvc
public class SpringExceptionHandler{  
    
    Logger logger = LoggerFactory.getLogger(this.getClass());  
  
    public static final String DEFAULT_ERROR_VIEW = "success";
    
    @ExceptionHandler(Exception.class)  
    @ResponseBody  
    public String defaultErrorHandler(HttpServletRequest req, Exception ex) throws Exception {
        logger.error("Error",ex);
        return ReturnFormat.retFailParam(ex.getMessage());
    }
    
    /*
     * 跳转页面
    @ExceptionHandler(Exception.class)  
    @ResponseBody  
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception ex) throws Exception {
        ModelAndView view=new ModelAndView(DEFAULT_ERROR_VIEW);
        return view;
    }
    */
  /* 部分会陷入 死循环,不能返回,使用拦截器
    //运行时异常
    @ExceptionHandler(MaxUploadSizeExceededException.class)  
    @ResponseBody  
    public String runtimeExceptionHandler(MaxUploadSizeExceededException ex) {  
        logger.error("Error",ex);
        return ReturnFormat.retFailParam("文件过大");
    } 
    */
   //运行时异常
    @ExceptionHandler(RuntimeException.class)  
    @ResponseBody  
    public String runtimeExceptionHandler(RuntimeException ex) {  
        logger.error("Error",ex);
        return ReturnFormat.retParam(1000, null);
    } 
    
    //空指针异常
    @ExceptionHandler(NullPointerException.class)  
    @ResponseBody  
    public String nullPointerExceptionHandler(NullPointerException ex) {  
        logger.error("Error",ex);
        return ReturnFormat.retParam(1001, null);
    }   
    //类型转换异常
    @ExceptionHandler(ClassCastException.class)  
    @ResponseBody  
    public String classCastExceptionHandler(ClassCastException ex) {  
        logger.error("Error",ex);
        return ReturnFormat.retParam(1002, null);  
    }  

    //IO异常
    @ExceptionHandler(IOException.class)  
    @ResponseBody  
    public String iOExceptionHandler(IOException ex) {  
        logger.error("Error",ex);
        return ReturnFormat.retParam(1003, null); 
    }  
    //未知方法异常
    @ExceptionHandler(NoSuchMethodException.class)  
    @ResponseBody  
    public String noSuchMethodExceptionHandler(NoSuchMethodException ex) {  
        logger.error("Error",ex);
        return ReturnFormat.retParam(1004, null);
    }  

    //数组越界异常
    @ExceptionHandler(IndexOutOfBoundsException.class)  
    @ResponseBody  
    public String indexOutOfBoundsExceptionHandler(IndexOutOfBoundsException ex) {  
        logger.error("Error",ex);
        return ReturnFormat.retParam(1005, null);
    }
    
    //400错误
    @ExceptionHandler({HttpMessageNotReadableException.class})
    @ResponseBody
    public String requestNotReadable(HttpMessageNotReadableException ex){
        logger.error("Error",ex);
        return ReturnFormat.retParam(400, null);
    }
    //400错误  参数类型不匹配
    @ExceptionHandler({TypeMismatchException.class})
    @ResponseBody
    public String requestTypeMismatch(TypeMismatchException ex){
        logger.error("参数类型不匹配,参数" + ex.getPropertyName() + "类型应该为" + ex.getRequiredType(),ex);
        return ReturnFormat.retParam(400,null);
    }
    //400错误 缺乏参数异常
    @ExceptionHandler({MissingServletRequestParameterException.class})
    @ResponseBody  
    public String requestMissingServletRequest(MissingServletRequestParameterException ex){
        logger.error("缺乏必要参数,参数名称为" + ex.getParameterName(),ex);
        return ReturnFormat.retParam(400,null);
    }
    //405错误
    @ExceptionHandler({HttpRequestMethodNotSupportedException.class})
    @ResponseBody
    public String request405(HttpRequestMethodNotSupportedException ex){
        logger.error("Error",ex);
        return ReturnFormat.retParam(405, null);
    }
    //406错误
    @ExceptionHandler({HttpMediaTypeNotAcceptableException.class})
    @ResponseBody
    public String request406(HttpMediaTypeNotAcceptableException ex){
        logger.error("Error",ex);
        return ReturnFormat.retParam(406, null);
    }
    
    //500错误
    @ExceptionHandler({ConversionNotSupportedException.class,HttpMessageNotWritableException.class})
    @ResponseBody
    public String server500(RuntimeException runtimeException){
        logger.error("Error",runtimeException);
        return ReturnFormat.retParam(406, null);
    }
  
}

File 上传 异常  MaxUploadSizeExceededException 有时候没法生效,传闻是 tomcat 缘由,可安以下方式修改web

<!-- 过滤文件拦截-->  
<mvc:interceptors>
   <mvc:interceptor>
     <!--方法名-->
     <mvc:mapping path="/**/upload.*"/>
       <bean class="com.wuage.ossserver.web.Interceptor.FileUploadInterceptor">
         <!--文件大小-->
         <property name="maxSize" value="5242880"/>
       </bean>
    </mvc:interceptor>
</mvc:interceptors>
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class FileUploadInterceptor implements HandlerInterceptor {
    
    private long maxSize;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if(request!=null && ServletFileUpload.isMultipartContent(request)) {
            ServletRequestContext ctx = new ServletRequestContext(request);
            long requestSize = ctx.contentLength();
            if (requestSize > maxSize) {
                throw new Exception("文件过大");
            }
        }
        return true;
    }


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }

    public void setMaxSize(long maxSize) {
        this.maxSize = maxSize;
    }
}
相关文章
相关标签/搜索