使用 @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; } }