Spring-annotation-AOP-Exception_handling
Spring-annotation-AOP-Exception_handling copied to clipboard
哥们, 在controller方法上@Vaild抛出的异常, 不能被aop接管啊
比如controller中这么个方法
@RequestMapping(value = "/hello2", method = RequestMethod.GET) public JsonResult<MyMsg> hello2(@Valid HelloVo helloVo) {//...}
如果rest调用时候, 故意传参有问题, 则直接进入了通用异常处理, 这样就不对了
而且AOP这个 before方法 也进不去
如果把统一异常处理注释掉, 则会进入 aop 的 before, 不过发现 pointcut不是这个 hello2 方法, 而是 org.springframework.boot.autoconfigure.web.BasicErrorController.error
AOP和ControllerAdvice方式都不行吗?因为我们项目中的校验方式 不是通过 @Valid 来校验的,所以这块还不是很清楚来。很强势,兄弟。 有了结果如果方便的话告诉我一下哈!
如果想全部异常走spring ,那么就全部请求走spring 的servlet,禁用<mvc:default-servlet-handler/>,开启:<mvc:resources mapping="/static/**" location="/static/"/>去匹配静态资源。这样就不需要服务器的error page了。
直接定义一个自己的控制器增强类,然后捕捉异常,比如:
@ControllerAdvice
public class GlobalExceptionHandlerController {
//这个异常的捕捉,需要在dispathServlet里,设置throwExceptionIfNoHandlerFound:true
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public ModelAndView noRequestHandlerFoundExceptionHandler(HttpServletRequest request, HttpServletResponse response, NoHandlerFoundException e) {
log.error("noRequestHandlerFoundExceptionHandler==error happens:", e);
String error = e.getMessage();
HttpStatusCode statusCode = HttpStatusCode.NOT_FOUND;
if (isJson(request)) {
log.info("这是一个json请求,返回json数据");
DataModel result = new DataModel(false, statusCode.reasonmsg(), e.getMessage() + "," + e.getCause(), statusCode.value());
sendJsonResponse(response, result);
return null;
} else {
log.error("没找到页面,普通web请求,返回html页面");
ModelAndView mav = new ModelAndView("pages/404");
mav.addObject("datetime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
mav.addObject("status_code", statusCode.value());
mav.addObject("exception", statusCode);
mav.addObject("error", error);
return mav;
}
}
}
对于bean 的java validate ,抛出错误:org.springframework.validation.BindException,新写一个即可。
=====:) 瞎写,共勉!
@Valid 抛出的异常要用BindingResult处理, 它会把对象上有错误信息如 @NotEmpty(message = "应用名称不能为空!"),那么BindingResult错误信息里就有"应用名称不能为空"的信息.你可以把这种详细的错误信息返回给前端.比用aop统一处理,打印同样的信息好.