• 中文
    • 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
    • 1.8k
    • 请登录之后再进行评论

      登录

      赞助本站

      • 支付宝
      • 微信
      • QQ

      感谢一直支持本站的所有人!

      单栏布局 侧栏位置: