首页
登录 | 注册

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等是自己封装的处理工具类。

相关文章

  • Spring入门(二):自动化装配bean
    Spring从两个角度来实现自动化装配: 组件扫描(component scanning):Spring会自动发现应用上下文中需要创建的bean. 自动装配(autowiring):Spring会自动满足bean之间的依赖. 为了更形象的解 ...
  • 目录 引入 简单工厂 抽象工厂 Spring的bean工厂 模拟Spring工厂实现 模拟IOC 引入 假设有一个司机, 需要到某个城市, 于是我们给他一辆汽车 public class Demo { public static void ...
  • 为什么说 Java 程序员到了必须掌握 Spring Boot 的时候?
    Spring Boot 2.0 的推出又激起了一阵学习 Spring Boot 热,就单从我个人的博客的访问量大幅增加就可以感受到大家对学习 Spring Boot 的热情,那么在这么多人热衷于学习 Spring Boot 之时,我自己也在 ...
  • java中常见的集合类大部分是非线程安全的,在多线程情况下会报并发修改异常(ConcurrentModificationException) 并发下的ArrayList类: 1 //集合类不安全的例子 2 public class Coll ...
  • Spring Boot入门(五):使用JDBC访问MySql数据库
    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序开发的过程中,操作数据库是必不可少的部分,前面几篇博客中,也一直未涉及到数据库的操作,本篇博客 就讲解下在Spring Boot中如何使用 ...
  • Spring的历史及哲学
    Spring的历史和哲学 1.Spring 历史 时间回到2002年,当时正是 Java EE 和 EJB 大行其道的时候,很多知名公司都是采用此技术方案进行项目开发.这时候有一个美国的小伙子认为 EJB 太过臃肿,并不是所有的项目都需要使 ...

2020 cecdns.com webmaster#cecdns.com
12 q. 0.067 s.
京ICP备10005923号