一. 返回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":"数据效验失败" }
请登录之后再进行评论