温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Spring中利用JSR303约束请求

发布时间:2020-12-18 14:11:52 来源:亿速云 阅读:176 作者:Leah 栏目:开发技术

怎么在Spring中利用JSR303约束请求?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

 1. 适用场景

有时候我们在表单里提交一系列参数, 到后台封装成一个对象, 要对对象的属性做各种字段值的约束; 这时候, 当然可以if-else一个一个的判断, 有更简洁的做法, 就是使用 JSR303+spring的validation:

2. 使用方法步骤(分3步)

  • 实体类加字段约束注解

  • Controller类中@Valid标注启用(@Validated也兼容@Valid)

  • BindingResult获取报错信息

2.1 实体类加字段约束注解

如我们要收集前端表单的字段数据到Person实体中:

对需要约束的字段进行注解标注;

示例:

2.1.1 Person.java

package com.niewj.demo.model; import lombok.Data; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.URL; import javax.validation.constraints.*; import java.util.List; @Data public class Person {   @Length(min = 4, max = 10)   @NotNull(message = "name不能为空")   private String name;   @Min(0)   @Max(40)   @NotNull(message = "age不能为空")   private Integer age;   @NotBlank   @NotBlank   @URL(message = "logo必须是URL格式")   private String logo;   @NotEmpty(message = "hobbies不能为空")   private List<String> hobbies;   @Email   @NotNull(message = "email不能为空!")   private String mail; }

@NotNull 约束字段不可为空;

@NotEmpty 约束集合/map等不能为空不能为0元素

@Email 约束是 email格式

@URL 约束必须是url的格式

message属性可以修改默认错误说明

2.2 Controller类中@Valid标注启用(@Validated兼容@Valid)

2.2.1 HelloController.java

package com.niewj.demo.controller; import com.google.gson.Gson; import com.niewj.demo.common.Result; import com.niewj.demo.model.Person; import com.niewj.demo.service.TestService1; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import java.util.HashMap; import java.util.Map; /**  * test  *  * @author niewj  * @since 2020/11/16 15:22  */ @Controller public class HelloController {   /**    * @param person    * @param bindingResult    * @return    */   @PostMapping("/test")   @ResponseBody   public Result doSth(@Valid @RequestBody Person person, BindingResult bindingResult) {     Map<String, String> map = new HashMap<>();     if (bindingResult.hasErrors()) {       bindingResult.getFieldErrors().stream().forEach(fe-> map.put(fe.getField(), fe.getDefaultMessage()));       System.out.println(bindingResult.getFieldError().getDefaultMessage());       return Result.withErrorParamData(map);     }     return Result.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.2 Result.java:

package com.niewj.demo.common; import lombok.Data; import java.io.Serializable; import java.util.Map; /**  * 返回结果模板封装  *  * @author niewj  * @since 2020/12/17 18:05  */ @Data public class Result<T> implements Serializable {   private int code;   private String msg;   private T data;   public Result(int code, String msg, T data) {     this(code, msg);     this.data = data;   }   public Result(int code, String msg) {     this.msg = msg;     this.code = code;   }   public static <T> Result<T> withData(ResponseEnum responseCode, T data) {     Result<T> re = new Result(responseCode.getCode(), responseCode.getMsg());     re.data = data;     return re;   }   public static Result<String> withSuccessNoData() {     Result re = new Result(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg());     re.data = "";     return re;   }   public static <T> Result<T> withSuccessData(T data) {     Result re = new Result(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg());     re.data = data;     return re;   }   public static Result<Map<String, String>> withErrorParamData(Map<String, String> data) {     Result re = new Result(ResponseEnum.BAD_REQUEST.getCode(), ResponseEnum.BAD_REQUEST.getMsg());     re.data = data;     return re;   } }

2.2.3 ResponseEnum.java

package com.niewj.demo.common; /**  * 通用响应码  */ public enum ResponseEnum {   SUCCESS(200, "成功"),   BAD_REQUEST(400, "请求参数不合规");   /**    * 错误码    */   private Integer code;   /**    * 错误信息    */   private String msg;   ResponseEnum(Integer code, String msg) {     this.code = code;     this.msg = msg;   }   public String getMsg() {     return msg;   }   public Integer getCode() {     return code;   } }

2.3 BindingResult获取报错信息

  • BindingResult用来收集约束字段的错误信息, 可通过 bindingResult.hasErrors()的 true来过滤错误信息;

  • bindingResult.getFieldErrors() 会返回 List<FieldError>;

  • 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"   } }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI