SpringBoot 和 SpringMVC的异常统一处理

             前几天看了我们公司以为大牛写了一个Springmvc的异常统一处理的方法,觉得很厉害,想去学习了解一下。今天看了一下,发现其实是很简单的实现逻辑,特来记录。

因,我自己搭建的测试框架的SpringBoot,所以正好把两种都来记录下来。

             Spring 版本

//继承SimpleMappingExceptionResolver类,重写他的doResolveException方法,
//在出现异常的时候,报错信息会走实现doResolveException的代码内容
public class ExceptionInterceptor extends SimpleMappingExceptionResolver {
	private static final Logger log = Logger.getLogger(ExceptionInterceptor.class);

	//编写重写类,在内部进行代码操作,如log。
	//将报错信息冲洗组装到Model里面return时,会有Spring方法进行处理
	@Override
	protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception ex) {
		ByteArrayOutputStream buf = new java.io.ByteArrayOutputStream();
		ex.printStackTrace(new java.io.PrintWriter(buf, true));
		ModelAndView resultMV = new ModelAndView();
		String errorMsg = buf.toString();
		log.error(errorMsg);
		// log.error(ex.getLocalizedMessage(), ex);
		resultMV.setViewName("500");
		resultMV.addObject("errorMsg", errorMsg);
		return resultMV;
	}
}
                这个时候并没有配置完毕,在某些场景,可能想要错误后,跳转到错误页面,或者对错误有更详细的分配,所以需要在配置文件中对此方法的注入进行修改

	<bean id="exceptionResolver" class="com.zito.zitopay.admin.web.ExceptionInterceptor">
		<property name="exceptionMappings">
			<props>
				<prop key="java.lang.SQLException">error</prop>
				<prop key="java.lang.Exception">error</prop>
			</props>
		</property>
	</bean>

   Spring 配置方法二

  在需要统一处理错误的Controller上加上@ControllerAdvice 

  在该Controller里面编写一个@ExceptionHandler方法如

   

  @ExceptionHandler(Exception.class)
	   @ResponseBody
	    public String handleException(Exception e) { 
		   return  e.getMessage();
	    } 
     该Controller下如果出错,都会去执行handleException像如上方法就会直接返回报错信息或者你throw new Exception(“message”)里面手动抛出的异常错误


扫描二维码关注公众号,回复: 1918083 查看本文章


这样啊就配置好了


            

      SpringBoot 版本


             关于SpringBoot的统一异常处理就更简单了。SB提供了更简单注解方式@ControllerAdvice,简单得来说,就是Spring能扫描到这个包的时候,所有的异常处理会在这里面进行。就如他名字一样,所有对Controller的请求报错,会向上抛,到Controller层。在@ControllerAdvice类下进行对应的异常处理


@ControllerAdvice  
public class GlobalexcptionHandler{  
  /** 
     * 全局处理Exception 
     * 错误的情况下返回500 
     * @param ex 
     * @param req 
     * @return 
     */  
    @ExceptionHandler(value = {RuntimeException.class})  
    public ResponseEntity<Object> handleOtherExceptions(final RuntimeException ex, final WebRequest req) {  
        Map<String, String> map=new HashMap<String, String>();
        map.put("Status", "500"); 
        map.put("Path", req.toString()); 
        map.put("ErrorMessage",ex.getMessage());  
        return new ResponseEntity<Object>(map,HttpStatus.OK);  
    }  
  
}  


        







猜你喜欢

转载自blog.csdn.net/zxysshgood/article/details/78427395