Spring中使用JSR303请求约束判空的实现
1.适用场景
有时候我们在表单里提交一系列参数,到后台封装成一个对象,要对对象的属性做各种字段值的约束;这时候,当然可以if-else一个一个的判断,有更简洁的做法,就是使用JSR303+spring的validation:
2.使用方法步骤(分3步)
- 实体类加字段约束注解
- Controller类中@Valid标注启用(@Validated也兼容@Valid)
- BindingResult获取报错信息
2.1实体类加字段约束注解
如我们要收集前端表单的字段数据到Person实体中:
对需要约束的字段进行注解标注;
示例:
2.1.1Person.java
packagecom.niewj.demo.model;
importlombok.Data;
importorg.hibernate.validator.constraints.Length;
importorg.hibernate.validator.constraints.URL;
importjavax.validation.constraints.*;
importjava.util.List;
@Data
publicclassPerson{
@Length(min=4,max=10)
@NotNull(message="name不能为空")
privateStringname;
@Min(0)
@Max(40)
@NotNull(message="age不能为空")
privateIntegerage;
@NotBlank
@NotBlank
@URL(message="logo必须是URL格式")
privateStringlogo;
@NotEmpty(message="hobbies不能为空")
privateListhobbies;
@Email
@NotNull(message="email不能为空!")
privateStringmail;
}
@NotNull约束字段不可为空;
@NotEmpty约束集合/map等不能为空不能为0元素
@Email约束是email格式
@URL约束必须是url的格式
message属性可以修改默认错误说明
2.2Controller类中@Valid标注启用(@Validated兼容@Valid)
2.2.1HelloController.java
packagecom.niewj.demo.controller;
importcom.google.gson.Gson;
importcom.niewj.demo.common.Result;
importcom.niewj.demo.model.Person;
importcom.niewj.demo.service.TestService1;
importorg.springframework.stereotype.Controller;
importorg.springframework.validation.BindingResult;
importorg.springframework.web.bind.annotation.*;
importjavax.annotation.Resource;
importjavax.validation.Valid;
importjava.util.HashMap;
importjava.util.Map;
/**
*test
*
*@authorniewj
*@since2020/11/1615:22
*/
@Controller
publicclassHelloController{
/**
*@paramperson
*@parambindingResult
*@return
*/
@PostMapping("/test")
@ResponseBody
publicResultdoSth(@Valid@RequestBodyPersonperson,BindingResultbindingResult){
Mapmap=newHashMap<>();
if(bindingResult.hasErrors()){
bindingResult.getFieldErrors().stream().forEach(fe->map.put(fe.getField(),fe.getDefaultMessage()));
System.out.println(bindingResult.getFieldError().getDefaultMessage());
returnResult.withErrorParamData(map);
}
returnResult.withSuccessData(person);
}
}
@RequestBody可以将body中的请求流信息(Request.getInputStream)通过HttpMessageConverter自动转换为目标java类型:
- 如果前端Content-Type为application/json,就使用JSON消息转换器帮你转为JSON对象;
- 如果前端Content-Type为application/xml,就使用XML消息转换器帮你转为xml;
- 如果前端Content-Type为text/plain,就是用String消息转换器帮你转成String;(只有类型为String时才可以转换)
2.2.2Result.java:
packagecom.niewj.demo.common; importlombok.Data; importjava.io.Serializable; importjava.util.Map; /** *返回结果模板封装 * *@authorniewj *@since2020/12/1718:05 */ @Data publicclassResultimplementsSerializable{ privateintcode; privateStringmsg; privateTdata; publicResult(intcode,Stringmsg,Tdata){ this(code,msg); this.data=data; } publicResult(intcode,Stringmsg){ this.msg=msg; this.code=code; } publicstatic Result withData(ResponseEnumresponseCode,Tdata){ Result re=newResult(responseCode.getCode(),responseCode.getMsg()); re.data=data; returnre; } publicstaticResult withSuccessNoData(){ Resultre=newResult(ResponseEnum.SUCCESS.getCode(),ResponseEnum.SUCCESS.getMsg()); re.data=""; returnre; } publicstatic Result withSuccessData(Tdata){ Resultre=newResult(ResponseEnum.SUCCESS.getCode(),ResponseEnum.SUCCESS.getMsg()); re.data=data; returnre; } publicstaticResult
2.2.3ResponseEnum.java
packagecom.niewj.demo.common;
/**
*通用响应码
*/
publicenumResponseEnum{
SUCCESS(200,"成功"),
BAD_REQUEST(400,"请求参数不合规");
/**
*错误码
*/
privateIntegercode;
/**
*错误信息
*/
privateStringmsg;
ResponseEnum(Integercode,Stringmsg){
this.code=code;
this.msg=msg;
}
publicStringgetMsg(){
returnmsg;
}
publicIntegergetCode(){
returncode;
}
}
2.3BindingResult获取报错信息
- BindingResult用来收集约束字段的错误信息,可通过bindingResult.hasErrors()的true来过滤错误信息;
- bindingResult.getFieldErrors()会返回List
; - FieldError得到字段名:getField();得到错误信息:getDefaultMessage()
3.调用测试:
http://localhost:8888/test
3.1请求用例1:字段为空
header:Content-Type:application/json
{
"name":"1"
}
响应:
{
"code":400,
"msg":"请求参数不合规",
"data":{
"mail":"email不能为空!",
"hobbies":"hobbies不能为空",
"name":"长度需要在4和10之间",
"logo":"不能为空",
"age":"age不能为空"
}
}
3.2请求用例2:list无元素/email/url格式不对
header:Content-Type:application/json
{
"name":"1234",
"hobbies":[],
"mail":"niewj",
"logo":"niewj.com"
}
响应:
{
"code":400,
"msg":"请求参数不合规",
"data":{
"mail":"不是一个合法的电子邮件地址",
"hobbies":"hobbies不能为空",
"logo":"logo必须是URL格式",
"age":"age不能为空"
}
}
3.3请求用例3:完整字段信息
header:Content-Type:application/json
{
"name":"1234",
"hobbies":["running"],
"mail":"hi@niewj.com",
"logo":"http://niewj.com",
"age":40
}
响应:
{
"code":200,
"msg":"成功",
"data":{
"name":"1234",
"age":40,
"logo":"http://niewj.com",
"hobbies":[
"running"
],
"mail":"hi@niewj.com"
}
}
到此这篇关于Spring中使用JSR303请求约束判空的实现的文章就介绍到这了,更多相关SpringJSR303请求约束判空内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!