Spring-annotation-AOP-Exception_handling icon indicating copy to clipboard operation
Spring-annotation-AOP-Exception_handling copied to clipboard

哥们, 在controller方法上@Vaild抛出的异常, 不能被aop接管啊

Open justkuai opened this issue 8 years ago • 3 comments

比如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

justkuai avatar Feb 17 '17 07:02 justkuai

AOP和ControllerAdvice方式都不行吗?因为我们项目中的校验方式 不是通过 @Valid 来校验的,所以这块还不是很清楚来。很强势,兄弟。 有了结果如果方便的话告诉我一下哈!

hjzgg avatar Feb 20 '17 16:02 hjzgg

如果想全部异常走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,新写一个即可。

=====:) 瞎写,共勉!

luterc avatar Sep 08 '17 08:09 luterc

@Valid 抛出的异常要用BindingResult处理, 它会把对象上有错误信息如 @NotEmpty(message = "应用名称不能为空!"),那么BindingResult错误信息里就有"应用名称不能为空"的信息.你可以把这种详细的错误信息返回给前端.比用aop统一处理,打印同样的信息好.

shihuangling avatar Nov 27 '18 03:11 shihuangling