场景:
用户在页面操作:添加一名学生信息(学生姓名为必填,其余属性均为选填)
package com.wisdom.qiqiao;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 学生类
*/
@Data
public class Student implements Serializable {
/**
* 学生姓名(必填)
*/
private String studentName;
/**
* 学生年龄(选填)
*/
private Integer studentAge;
/**
* 学生住址(选填)
*/
private String studentAddress;
/**
* 兴趣爱好(选填)
*/
private List hobbyList;
}
/**
* 兴趣爱好类
*/
@Data
class Hobby implements Serializable {
/**
* 兴趣爱好名称(必填)
*/
private String hobbyName;
/**
* 兴趣爱好程度(1~10分)(非必填)
*/
private Integer hobbyDegree;
}
假设用户将所有属性都进行填写,则前端传给后端的JSON格式如下:
{
"studentName": "张三",
"studentAge": 18,
"studentAddress": "广东",
"hobbyList": [
{
"hobbyName": "Java",
"hobbyDegree": 8
},
{
"hobbyName": "前端",
"hobbyDegree": 7
}
]
}
假设用户只填写了“必填项”(即 学生姓名),则前端传给后端JSON格式将存在异议,大致有四种:
格式一:
{
"studentName": "张三"
}
格式二:
{
"studentName": "张三",
"studentAge": null,
"studentAddress": null,
"hobbyList": null
}
格式三:
{
"studentName": "张三",
"studentAge": null,
"studentAddress": null,
"hobbyList": []
}
格式四:
{
"studentName": "张三",
"studentAge": "",
"studentAddress": "",
"hobbyList": []
}
由于Spring Boot为我们集成了简便的校验注解,所以一般会采用优雅写法接收前端入参:
package com.wisdom.qiqiao;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.List;
/**
* 学生 保存DTO
*
* @author Jiahai
*/
@Data
public class StudentForSaveDTO implements Serializable {
/**
* 学生姓名(必填)
*/
@NotBlank(message = "学生姓名 不可为空")
@Length(min = 2, max = 5, message = "学生名字 不合法")
private String studentName;
/**
* 学生年龄(选填)
*/
@Range(min = 18, max = 30, message = "学生年龄 不合法")
private Integer studentAge;
/**
* 学生住址(选填)
*/
@Length(min = 2, max = 5, message = "学生名字 不合法")
private String studentAddress;
/**
* 兴趣爱好(选填)
*/
@Valid
@Size(min = 2, max = 5, message = "兴趣爱好 不合法")
private List hobbyList;
}
/**
* 兴趣爱好类
*/
@Data
class HobbyForSaveDTO implements Serializable {
/**
* 兴趣爱好名称(必填)
*/
@Length(min = 2, max = 6, message = "兴趣爱好名称 不合法")
private String hobbyName;
/**
* 兴趣爱好程度(1~10分)(非必填)
*/
@Range(min = 1, max = 10, message = "兴趣爱好程度 不合法")
private Integer hobbyDegree;
}
package com.wisdom.qiqiao;
import com.wisdom.qiqiao.base.response.APIResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 学生 API
*
* @author Jiahai
*/
@RestController
@RequestMapping("/student")
public class StudentController {
/**
* 新增
*
* @param studentForSaveDTO 学生 新增入参DTO
* @return
*/
@PostMapping
public APIResult save(@Validated @RequestBody StudentForSaveDTO studentForSaveDTO) {
// TODO 保存学生信息...
return APIResult.success();
}
}
Spring Boot 为我们提供的校验注解(来自 spring boot starter validation),可以使得后端灵活处理以下场景:
对于必填字段,可要求前端必填(例如 @NotBlank(message = "学生姓名 不可为空")),且对入参值进行指定规则校验(例如 @Length(min = 2, max = 5, message = "学生名字 不合法"))
对于选填字段,可灵活处理 当前端传了值,则可进入指定校验;如果前端不传值,则跳过校验
个人看法:
综上所述:
本文仅为个人观点,欢迎大家发表意见,谢谢。