美文网首页
2019-01-14 springboot validation

2019-01-14 springboot validation

作者: 木人呆呆 | 来源:发表于2019-01-14 10:21 被阅读14次

    1、对象校验

    为了接口的健壮性,我们通常除了客户端进行输入合法性校验外,在 Controller 的方法里,我们也需要对参数进行合法性校验,传统的做法是每个方法的参数都做一遍判断,这种方式和上一节讲的异常处理一个道理,不太优雅,也不易维护。
    其实,SpringMVC 提供了验证接口,下面请看代码:
    实体

    package com.demo.entity;
    
    import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.NotEmpty;
    
    import org.hibernate.validator.constraints.Length;
    import org.hibernate.validator.constraints.Range;
    public class User {
        @NotBlank(message = "用户名称不能为空。")
        private String userName;
        @Range(max = 150, min = 1, message = "年龄范围应该在1-150内。")
        private int age;
    
        @NotEmpty(message = "密码不能为空")
        @Length(min = 6, max = 8, message = "密码长度为6-8位。")
        private String passwd;
        
        public User() {
            super();
        }
        
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getPasswd() {
            return passwd;
        }
        public void setPasswd(String passwd) {
            this.passwd = passwd;
        }
    

    controller类

    package com.demo.controller;
    
    import java.util.List;
    
    import org.springframework.ui.ModelMap;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.annotation.Validated;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.demo.entity.User;
    import com.demo.result.Result;
    import com.demo.util.Validation;
    
    @RestController
    @RequestMapping(value="/user")
    public class ValidationController {
        
        @RequestMapping(value="/add",method=RequestMethod.POST)
        public ModelMap add(@RequestBody @Validated User u,BindingResult result) {
            List<?> l = Validation.getValidation(result);
            if(l.size() != 0) {
                return Result.error(l);
            }
            return Result.success();
        }
    }
    

    还需要一个遍历整个校验对象的工具类

    package com.demo.util;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.FieldError;
    
    public class Validation {
        
        public static List<?> getValidation(BindingResult result) {
            List<String> resultList = new ArrayList<>();
            if(result.hasFieldErrors()){
                List<FieldError> errorList = result.getFieldErrors();
                errorList.forEach(item -> resultList.add(item.getField()+" "+item.getDefaultMessage()));
            }
            return resultList;
        }
    
    }
    

    基本上spring mvc已经给我们提供了足够的校验类型,如果不能满足项目需求,还可以使用正则表达式的方式,或者自定义注解的方式。
    在 controller 的方法需要校验的参数后面必须跟 BindingResult,否则无法进行校验。但是这样会抛出异常,对用户而言不太友好!

    2、拦截异常并统一处理

    在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。

    package com.demo;
    
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @ControllerAdvice
    public class GlobalExceptionHandler {
        
        /**
         * 全局异常捕获
         * @param req
         * @param e
         * @return
         * @throws Exception
         */
        @ExceptionHandler(value = Exception.class)
        @ResponseBody
        public ModelMap handleException(Exception e) {
            ModelMap modelMap = new ModelMap();
            modelMap.addAttribute("msg", "后台异常捕获");
            modelMap.addAttribute("Exception", e);
            return modelMap;
        }
    }
    

    @ExceptionHandler 拦截了异常,我们可以通过该注解实现自定义异常处理。其中,@ExceptionHandler 配置的 value 指定需要拦截的异常类型,上面拦截了 Exception.class 这种异常。

    源代码可以在https://gitee.com/shup092/springboot-validation.git下载

    相关文章

      网友评论

          本文标题:2019-01-14 springboot validation

          本文链接:https://www.haomeiwen.com/subject/rifddqtx.html