Spring中通过java的@Valid注解和@ControllerAdvice实现全局异常处理。

通过java原生的@Valid注解和spring的@ControllerAdvice和@ExceptionHandler实现全局异常处理的方法:

controller中加入@Valid注解:

    @RequestMapping(value="/addCountry", method=RequestMethod.POST)
    public ResponseResult addCountry(@RequestBody @Valid Country country) {
        return null;
    }

接受entity中加入@NotNull注解:(验证还有很多,这里是举例说明)

    @NotNull(message = "countryname params must not be null.")
    private String countryname;

全局处理工具类加入@ControllerAdvice和@ExceptionHandler注解:

@ControllerAdvice
public class GlobalExceptionAdvisor {
    Logger logger = LoggerFactory.getLogger(GlobalExceptionAdvisor.class);

    /**
     * 提取Validator产生的异常错误
     * @param bindingResult
     * @return
     */
    private BaseException parseBindingResult(BindingResult bindingResult){
        Map<String,String> errorMsgs = new HashMap<String,String>();
        for (FieldError error:bindingResult.getFieldErrors()){
            errorMsgs.put(error.getField(),error.getDefaultMessage());
        }
        if(errorMsgs.isEmpty()) {
            return new IllegalParameterCommonException();
        }else {
            return new IllegalParameterCommonException(JsonUtils.toJSONString(errorMsgs));
        }
    }

    /**
     * 捕获@Validate校验抛出的异常
     * @param e
     * @param request
     * @param response
     * @return
     */
    @ExceptionHandler(BindException.class)
    @ResponseBody
    public ResponseResult validExceptionHandler(BindException e, HttpServletRequest request, HttpServletResponse response) {
        BaseException ex = parseBindingResult(e.getBindingResult());
        logger.error(ex.getMessage());
        return ResultUtil.error(ex);
    }

    /**
     * 捕获@Validate校验抛出的异常
     * @param e
     * @param request
     * @param response
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public ResponseResult validException2Handler(MethodArgumentNotValidException e, HttpServletRequest request, HttpServletResponse response) {
        BaseException ex = parseBindingResult(e.getBindingResult());
        logger.error(ex.getMessage());
        return ResultUtil.error(ex);
    }

    @ExceptionHandler(value = BaseException.class)
    @ResponseBody
    public ResponseResult gisExceptionHandler(HttpServletRequest req, BaseException e) throws Exception {
        logger.error(e.getMessage());
        return ResultUtil.error(e);
    }

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseResult exceptionHandler(HttpServletRequest req, Exception e) throws Exception {
        logger.error(e.toString());
        return ResultUtil.error(new BaseException());
    }
}

  

BaseException、ResponseResult等是自己封装的处理工具类。

原文地址:https://www.cnblogs.com/tangquanbin/p/10312001.html

时间: 2024-10-06 10:11:28

Spring中通过java的@Valid注解和@ControllerAdvice实现全局异常处理。的相关文章

Spring中基于Java的配置@Configuration和@Bean用法 (转)

spring中为了减少xml中配置,可以生命一个配置类(例如SpringConfig)来对bean进行配置. 一.首先,需要xml中进行少量的配置来启动Java配置: [java] view plain copy print? <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmln

Spring中基于Java的容器配置(二)

使用@Configuration注解 @Configuration注解是一个类级别的注解,表明该对象是用来指定Bean的定义的.@Configuration注解的类通过@Bean注解的方法来声明Bean.通过调用注解了@Bean方法的返回的Bean可以用来构建Bean之间的相互依赖关系,可以通过前文来了解其基本概念. 注入inter-bean依赖 当@Bean方法依赖于其他的Bean的时候,可以通过在另一个方法中调用即可. @Configuration public class AppConfi

Spring中常用的配置和注解详解

一.  Spring中常用的配置文件详解 Spring中的配置文件详解 1.<!-- 配置注解bean的扫描路径 该配置表示从cn包下开始扫描--> <context:component-scan base-package="cn"></context:component-scan> 2.<!-- 加载资源文件 其中Location表示从哪个路径加载配置文件properties--> <context:property-placeh

Spring中基于Java的配置@Configuration和@Bean用法

Spring中为了减少xml中配置,可以创建一个配置类(例如ExampleConfiguration)来对bean进行配置. 1.配置spring配置文件来启用Java注解 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.o

使用Java代码和注解完成Spring配置

使用Java代码和注解完成Spring配置 使用Java代码和注解进行Spring的配置.个人理解: 使用Spring的时候可以使用XML文件配置,也可以使用Java代码配置.使用Java代码配置的时候,相当于使用Java类作为XML的配置文件,通过使用java代码创建bean实例,并通过java代码完成依赖的注入操作.当需要变更依赖注入时,可通过修改java代码实现. 使用注解配置的时候,个人理解存在两种方式第一种是注解+XML形式,第二种是Java代码+注解形式.使用Java+注解的形式,相

用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)

用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心.依赖注入(DI)是IoC的另外一种说法,只是从不同的角度描述相同的概念.看完这两句,是不是不但没懂,反而更迷惑了,别急,往下看: IoC的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 如果我们打开机械式手表的后盖,就会看到与

Spring依赖注入——java项目中使用spring注解方式进行注入

注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.Controller.Repository.Component. Autowired是自动注入,自动从spring的上下文找到合适的bean来注入 Resource用来指定名称注入 Qualifier和Autowired配合使用,指定bean的名称 Service,Controller,Repository分别标记类是Service层类,Contro

第5章—构建Spring Web应用程序—关于spring中的validate注解后台校验的解析

关于spring中的validate注解后台校验的解析 在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间.成本.质量的博弈中必然会落后.所以把校验层抽象出来是必然的结果,下面说下几种解决方案. 1.简单的校验Demo 依赖: <dependency> <groupId>javax.validation</groupId> <

Spring框架的@Valid注解

上一篇文章介绍了springmvc的get请求参数可以是一个自定的对象.那么如何限制这个对象里的参数是否必传呢? 方法一:在代码逻辑里取出对象里的这个值,手动进行判断 方法二:使用@Valid注解,在接口请求的时候让Spring自己进行判断 比较 如果用上面两个方法进行非空判断,当参数传的是空的时候, 方法一的返回结果的状态是 200,方法二的返回结果状态是 400: 方法一需要自定义返回结果并且可以直接在页面中进行展示,方法二的返回结果需要从Response Body中获取. 方法一复杂,方法