上文我们讨论了spring-boot如何去获取前端传递过来的参数,那传递过来总不能直接使用,需要对这些参数进行校验,符合程序的要求才会进行下一步的处理,所以本篇文章我们主要讨论spring-boot中如何进行参数校验。
在介绍参数校验之前,先来了解一下lombok的使用,因为在接下来的实例中或有不少的对象创建,但是又不想写那么多的getter和setter,所以先介绍一下这个很强大的工具的使用。
Lombok 是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
在pom文件中添加如下内容:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency>
@Getter
给类增加get方法
@Setter
给类增加set方法
@Builder
给类增加构建者模式
@AllArgsConstructor
给类增加全参构造方法
@NoArgsConstructor
给类增加无参数构造方法
@RequiredArgsConstructor
按照必填属性增加构造方法
@NonNull
变量值不能为空
这里只简单列一下常用注解的含义,具体的使用方式在参数校验的实例中体现。
上篇文章中我们用BannerCreateDto这个对象了来接收前端传递的参数,那时是手动添加的get和set方法,这里我们用lombok注解来简化掉之前的样板代码:
@Setter @Getter public class BannerCreateDto { private String name; private Integer pos; }
接口的定义还是和之前一样。不同做任何修改:
@PostMapping(value = "/create") public Map<String, Object> createBanner(@RequestBody BannerCreateDto dto){ Map<String, Object> res = new HashMap<>(); res.put("id", 10000); res.put("name", dto.getName()); res.put("pos", dto.getPos()); return res; }
重新运行程序,访问接口
还是和之前一样,能够请求成功并正常的返回数据。
一般情况下,我们会针对返回的数据,来单独定义对象来进行描述,这里我们也定义一个
@Builder @Getter public class BannerResponseDto { private int id; private String name; private Integer pos; }
这里用到了@Builder、@Getter,在接口中构造对象并返回:
@PostMapping(value = "/create") public BannerResponseDto createBanner(@RequestBody BannerCreateDto dto){ return BannerResponseDto.builder() .id(500) .name(dto.getName()) .pos(dto.getPos()) .build(); }
可以看到lombok的@Builder注解,能够让类通过构建者模式去创建对象,省去了大量的set代码,而且可读性也很好。
访问接口,看看数据返回的时候正常:
与之前是一样的,能够正常返回数据,那接下来我们就正式看一下,spring-boot如何进行参数校验了。
参数校验就是说对前端传过来的数据进行合理性校验,看他能否满足我们的业务规则,那这些对参数进行校验的代码是该放在那里呢,是在Controller里还是说单独存放,又获取采用其他什么方式呢?
首先要明确的一点,在Controller,不应该有大量逻辑判断的代码,为什么呢,我们可想想当参数较多的时候,对每个参数进行合理性校验的话,那代码量该有多少,那就会严重污染Controller,导致维护起来是很艰难的,所以应该要有一个合理的机制能把校验的代码抽离出来,从而保证Controller的简洁性。
在java的世界里有这么个概念叫做 JSR,是Java Specification Requests的首字母缩写,是编程语言Java规范请求或者说是Java语言的说明书,既然是说明书那就一定有各个版本,在JSR-303版本中,提出了Bean Validation的验证规范,目前主要有两个两个框架实现了Bean Validation规范,一个事自带的javax.validation.api和hibernate-validator框架,而hibernate-validator框架应用的更加广泛一点。
那我们就用这种Bean Validation这种验证框架进行参数的验证
@RestController @Validated public class BannerController { @GetMapping("/v3/banner") public Map<String, Object> getBannerDetailV2(@RequestParam Integer id, @RequestParam @Max(10) Integer pos){ Map<String, Object> body = new HashMap<>(); body.put("id", id); body.put("pos", pos); return body; } }
上面代码中,@Max(10)注解来验证输入参数的pos,限制其输入参数最大值为10,运行程序我们来测试一下:
访问接口http://localhost:8081/v3/banner?id=12&pos=33后,看到我们控制台的输出提示输入不能超过10,这里的这个message不是我写的哈,这是java国际化后的效果能够根据你所在地区决定显示什么语言。
当然这里我们也可以自定义错误的message:
@GetMapping("/v3/banner") public Map<String, Object> getBannerDetailV2(@RequestParam Integer id, @RequestParam @Max(value = 10, message = "超过10了,赶紧看看哇") Integer pos){ Map<String, Object> body = new HashMap<>(); body.put("id", id); body.put("pos", pos); return body; }
还是上面的请求路径,看看控制台输出:
可以看到控制台输出了我们自定义的内容。这里有一点要注意,要想使得校验生效,比如在Controller上方打上@Validated注解,至于为什么我们后面分解。
上面的验证都是比较基础的数据类型,但是如果现在要有验证更加复杂一点的java对象呢,又该如何操作,那接下来我们再看看这部分的内容。
还是用上面的BannerResponseDto来进行演示
import org.hibernate.validator.constraints.Length; @Setter @Getter public class BannerCreateDto { @Length(min = 2, max = 4, message = "banner名称必须是2-10个字符") private String name; private Integer pos; }
对于这些基础类型的成员变量仍然使用这些基础注解进行校验定义,上面我们使用了 @Length注解来定义banner名称的字符长度范围,并定义发生错误时提示的message,这里还需要在Controller里额外的处理一下:
@PostMapping("/v3/banner/create") public BannerResponseDto createBanner(@RequestBody @Validated BannerCreateDto dto){ return BannerResponseDto.builder() .id(500) .name(dto.getName()) .pos(dto.getPos()) .build(); }
@Validated BannerCreateDto这里必须要加@Validated注解,否则无法触发校验机制。
如果某个类的成员变量也是一个自定义对象,那校验该是什么样的呢,下面我们来看一下。
先定义一个新的对象,用来接收banner到的素材信息
@Getter @Setter public class MaterialDto { @Length(min = 2, max = 5, message = "素材的名称长度范围必须在2-5之内") private String name; }
然后banner对象增加一个成员变量
@Setter @Getter public class BannerCreateDto { @Length(min = 2, max = 4, message = "banner名称必须是2-10个字符") private String name; private Integer pos; @Valid private MaterialDto materialDto; }
这里有一点,要想使得这种级联的关系能够触发校验机制,必须 @Valid注解进行标记,我们来请求一下url看看效果
可以看到校验没通过,再看看控制台输出内容:
输出了我们定义的错误信息。
本篇文章主要介绍了里面lombok的使用,以及校验规范介绍和校验框架基本注解的使用,还有自定义对象校验,下篇文章我们将通过自定义注解来实现更加个性化的校验规则,敬请期待。
到此这篇关于如何在spring-boot中进行参数校验的文章就介绍到这了,更多相关spring-boot 参数校验内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
时间:2020-05-15
开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空,非null,整数值的范围,字符串的个数,日期,邮箱等等.最常见的就是我们直接写代码校验,这样以后比较繁琐,而且不够灵活. Bean Validation 1.0(JSR-303)是一个校验规范,在spring Boot项目由于自带了hibernate validator 5(http://hibernate.org/validator/)实现,所以我们可以非常方便的使用这个特性 . 核心的pom依赖:
1.背景介绍 开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码 这样写并没有什么错,还挺工整的,只是看起来不是很优雅而已. 接下来,用Validation来改写这段 2.Spring Boot文档中的Validation 在Spring Boot的官网中,关于Validation只是简单的提了一句,如下 其实,Spring Validator和Hibernate Validator是两套Validator,可以混着用,这里我们用Hibernate Validator 3.
本文介绍基于 Spring Boot 和 JDK8 编写一个 AOP ,结合自定义注解实现通用的接口参数校验. 缘由 目前参数校验常用的方法是在实体类上添加注解,但对于不同的方法,所应用的校验规则也是不一样的,例如有一个 AccountVO 实体: public class AccountVO { private String name; // 姓名 private Integer age; // 年龄 } 假设存在这样一个业务:用户注册时需要填写姓名和年龄,用户登陆时只需要填写姓名就可以了.那
注意:本文dubbo 版本 2.8.4 springboot 版本 2.0.4.RELEASE 项目结构 test-rest (前端消费着,controller 层,springboot+maven项目) test-api (dubbo服务 的 api ,只记录 service 接口和 model ,maven 项目) test-provider(dubbo 服务提供者,实际的数据库操作及业务层, springboot+maven项目 ) 背景: 使用springmvc做restful,使用du
Spring boot开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空.整数值的范围.字符串的长度.日期.邮箱等等.Spring支持JSR-303 Bean Validation API,可以方便的进行校验. 使用注解进行校验 先定义一个form的封装对象 class RequestForm { @Size(min = 1, max = 5) private String name; public String getName() { return n
JSR303 是一套 JavaBean 参数校验的标准 1.pom导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 2.注解类型 (1)空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null,
项目背景 最近在项目上对接前端的的时候遇到了几个问题 1.经常要问前端要请求参数 2.要根据请求参数写大量if...else,代码散步在 Controller 中,影响代码质量 3.为了解决问题1,到处记日志,导致到处改代码 解决方案 为了解决这类问题,我使用了@Valid 做参数校验,并使用AOP记录前端请求日志 1.Bean实体类增加注解 对要校验的实体类增加注解,如果实体类中有List结构,就在List上加@Valid @Valid注解 注解 备注 @Null 只能为null @NotNu
在Spring5.0和SpringBoot2.0中废弃了WebMvcConfigurerAdapter类. 现有两种解决方案 1 直接实现WebMvcConfigurer (官方推荐) 2 直接继承WebMvcConfigurationSupport 本篇文章讨论下使用第一种方式完成参数校验. 首先附上代码. @Slf4j @Controller @RequestMapping("/goods") public class GoodsController { @Autowired Mi
@Valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能,具体的代码如下,是最基本的应用: 实体: public class DepartmentDto { @ApiModelProperty("id") private String id; @ApiModelProperty("上级Id") private String parentId; @ApiModelPr
这篇文章主要介绍了springboot如何使用AOP做访问请求日志,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 springboot中使用AOP做访问请求日志:这次引入springboot的aop和日志 1.pom.xml引入: <!--springBoot的aop,已经集成了spring aop和AspectJ--> <dependency> <groupId>org.springframework.boot<
最近公司重构项目,重构为最热的微服务框架 spring boot, 重构的时候遇到几个可以统一处理的问题,也是项目中经常遇到,列如:统一校验参数,统一捕获异常... 仅凭代码 去控制参数的校验,有时候是冗余的,但通过框架支持的 去控制参数的校验,是对于开发者很友好,先看下面的例子 @NotEmpty(message="手机号不能为空") @Size(min=11,max=11,message="手机号码长度不正确") @Pattern(regexp=StringUt
前言 工作中发现一个定律,如果总是习惯别人帮忙做事的结果是自己不会做事了.一直以来,spring帮我解决了程序运行中的各种问题,我只要关心我的业务逻辑,设计好我的业务代码,返回正确的结果即可.直到遇到了400. spring返回400的时候通常没有任何错误提示,当然也通常是参数不匹配.这在参数少的情况下还可以一眼看穿,但当参数很大是,排除参数也很麻烦,更何况,既然错误了,为什么指出来原因呢.好吧,springmvc把这个权力交给了用户自己.话不多说了,来一起看看详细的介绍吧. springmvc