• 中文
    • English
  • 注册
  • 查看作者
  • SpringBoot:使用JSON的工具类进行JSR303数据校验

    一.  返回JSON的工具类

    在以往的项目中,我们的Controller中有大量的方法需要返回一个JSON字符串,我们通常会单独定义一个map,然后将对应的结果put进map中,再使用fastjson将该map转换成json字符串返回,或者直接手动拼一个json字符串将其返回,无论怎么做,步骤都比较繁琐。当我们的项目中出现了大量这种比较繁琐,步骤又几乎相同的操作时,我们便可以单独定义一个类来解决这些繁琐的操作:

    import java.util.HashMap;
    import java.util.Map;
    
    public class R extends HashMap<String, Object> {
        public static R success() {
            R r = new R();
            r.put("success", true);
            return r;
        }
    
        public static R success(String message) {
            R r = new R();
            r.put("success", true);
            r.put("message", message);
            return r;
        }
    
        public static R success(Map<String, Object> map) {
            R r = new R();
            r.put("success", true);
            r.putAll(map);
            return r;
        }
    
        public static R success(Object data) {
            R r = new R();
            r.put("success", true);
            r.put("data", data);
            return r;
        }
    
        public static R error() {
            R r = new R();
            r.put("success", false);
            return r;
        }
    
        public static R error(Exception e) {
            R r = new R();
            r.put("success", false);
            r.put("exception", e);
            return r;
        }
    
        public static R error(String message) {
            R r = new R();
            r.put("success", false);
            r.put("message", message);
            return r;
        }
    
     /*
      public R put(String key, String value) {
            super.put(key, value);
            return this;
        }
      */
        //链式编程,即方法的返回值是自身,类似于JQuery对象
        public R put(String key, Object value) {
            super.put(key, value);
            return this;
        }
    
        public static R error(Object data) {
            R r = new R();
            r.put("success", false);
            r.put("data", data);
            return r;
        }
    
    }

    我们可以在Controller中简单写一个测试方法,测试上面的工具类:

    import io.zhangjia.springboot5.util.R;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class TestController {
    
        @GetMapping("/test")
        @ResponseBody //因为返回的是R
        public R test(Integer age) {
            return age >= 18 ? R.success() : R.error("您还未满18岁,不能进网吧");
        }
    }

    接下来我们访问http://localhost:8888/test?age=13,页面显示为以下内容:

    {"success":false,"message":"您还未满18岁,不能进网吧"}

    如果访问http://localhost:8888/test?age=19页面显示为以下内容:

    {"success":true}

    其中R.success()调用的是R类中的public static R success(),而R.error(“您还未满18岁,不能进网吧”)调用的是R类中的 public static R error(String message) 。

    假如我们想添加更多的返回信息,还可以调用R类中的其他方法,比如调用public R put(String key, Object value) :

    import io.zhangjia.springboot5.util.R;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class TestController {
    
        @GetMapping("/test")
        @ResponseBody //因为返回的是R
        public R test(Integer age) {
            return age > 18 ? R.success("欢迎您上网").put("姓名","张甲").put("机器号",123) : R.error("您还未满18岁,不能进网吧");
        }
    }

    访问http://localhost:8888/test?age=19页面显示为以下内容:

    {"姓名":"张甲","success":true,"机器号":123,"message":"欢迎您上网"}

    二.  JSR303数据校验

    假如有一个表单,用于接收用户的一些基本信息,我们可以在前端完成相关数据的校验,还可以在后端使用JSR303完成相应的数据校验。

    首先准备一个实体类:person.java,并添加相应的注解:

    • @NotBlank(message = “姓名不能为空”):该参数不能null,也不能为空字符串,message可以填写为错误信息
    • @Range(min = 18,max=60,message = “年龄不对!”):该参数的取值范围为:18  <= 参数  <= 60
    • @Email(message = “不是正确的邮箱格式”):该参数必须为邮箱的格式
    package io.zhangjia.springboot5.entity;
    
    import org.hibernate.validator.constraints.Range;
    
    import javax.validation.constraints.Email;
    import javax.validation.constraints.NotBlank;
    
    public class Person {
    
        @NotBlank(message = "姓名不能为空")
        private String name;
    
        @Range(min = 18,max=60,message = "年龄不对!")
        private Integer age;
    
        @Email(message = "不是正确的邮箱格式")
        private String email;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", email='" + email + '\'' +
                    '}';
        }
    }

    接下来编写对应的Controller,并在该方法的参数中添加以下内容:

    • @Valid :开启验证
    • BindingResult bindingResult:如果不在参数中添加该内容,只要校验不通过,请求会直接无法发起,也就没法返回错误信息
    import io.zhangjia.springboot5.entity.Person;
    import io.zhangjia.springboot5.util.R;
    import org.springframework.stereotype.Controller;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.FieldError;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import javax.validation.Valid;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    @Controller
    public class PersonController {
        @GetMapping("/person")
        @ResponseBody
        public R person(@Valid Person person, BindingResult bindingResult){
           if(bindingResult.hasErrors()) {
               List<FieldError> fieldErrors = bindingResult.getFieldErrors();
               List<Map<String,Object>>  errorList = new ArrayList<>();
    
               for (FieldError fieldError: fieldErrors) {
                   Map<String,Object> errorMap = new HashMap<>();
                   String field = fieldError.getField();
                   String message = fieldError.getDefaultMessage();
                   errorMap.put("field",field);
                   errorMap.put("message",message);
                   errorList.add(errorMap);
               }
    
               return R.error(errorList).put("message","数据效验失败").put("错误个数",errorList.size());
           }
           return R.success(person);
        }
    }

    接下来我们访问http://localhost:8888/person?name=&age=17&email=zhangjia188.com,页面显示为以下内容:

    {"错误个数":3,"data":[{"field":"name","message":"姓名不能为空"},{"field":"email","message":"不是正确的邮箱格式"},{"field":"age","message":"年龄不对!"}],"success":false,"message":"数据效验失败"}

    将该JSON字符串格式化显示如下:

    {
        "错误个数":3,
        "data":[
            {
                "field":"name",
                "message":"姓名不能为空"
            },
            {
                "field":"email",
                "message":"不是正确的邮箱格式"
            },
            {
                "field":"age",
                "message":"年龄不对!"
            }
        ],
        "success":false,
        "message":"数据效验失败"
    }

     

  • 0
  • 0
  • 0
  • 2.3k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: