当前位置: 首页 > 后端技术 > Python

测试开发题目:如何在spring-boot中进行参数校验

时间:2023-03-26 14:50:35 Python

上面我们讨论了spring-boot是如何获取前端传递过来的参数的,但是传递过来的参数是不能直接使用的,需要对这些参数进行校验。只有满足程序的要求才会进行下一步处理,所以本文主要讨论如何在spring-boot中进行参数校验。lombok的使用介绍在介绍参数校验之前,我们先来了解下lombok的使用,因为接下来的例子中可能会创建很多对象,但是我不想写那么多的getter和setter,所以先介绍一下这个最先。使用强大的工具。Lombok是一个工具,可以通过简单的注解帮助我们简化和剔除一些必要但又臃肿的Java代码。通过使用相应的注解,可以在编译源代码时生成相应的方法。添加maven依赖在pom文件中添加如下内容:org.projectlomboklombok1.18.10基础注解@Getter给类添加get方法@Setter给类添加set方法@Builder给类添加builder模式@AllArgsConstructor给类添加全参构造函数@NoArgsConstructor给类添加无参构造函数@RequiredArgsConstructor添加构造函数@NonNull变量根据需要的属性值不能为空。这里简单列出常用注解的含义。具体用法体现在参数校验的例子中。在上一篇文章中,我们使用BannerCreateDto对象来接收前端传过来的参数。当时是手动添加了get和set方法。这里我们使用lombok注解来简化之前的样板代码:@Setter@GetterpublicclassBannerCreateDto{privateStringname;privateIntegerpos;}接口的定义还是和之前一样。不要做任何修改:@PostMapping(value="/create")publicMapcreateBanner(@RequestBodyBannerCreateDtodto){Mapres=newHashMap<>();res.put("id",10000);res.put("姓名",dto.getName());res.put("pos",dto.getPos());returnres;}重新运行程序,访问界面还是和之前一样,可以正常请求成功并返回数据。一般情况下,我们会为返回的数据单独定义对象来描述。这里我们还定义了一个@Builder@GetterpublicclassBannerResponseDto{privateintid;私有字符串名称;privateIntegerpos;}@Builder,@Getter,在接口中构造对象并返回:@PostMapping(value="/create")publicBannerResponseDtocreateBanner(@RequestBodyBannerCreateDtodto){returnBannerResponseDto.builder().id(500).name(dto.getName()).pos(dto.getPos()).build();}可以看到lombok的@Builder注解,可以让类通过builder模式创建对象,省事不少一组代码,可读性很好。访问接口,看到数据正常返回:和之前一样,可以正常返回数据。那我们就正式的看一下spring-boot是如何进行参数校验的。参数校验参数校验就是校验前端传来的数据的合理性,看是否能满足我们的业务规则,那么这些校验参数的代码应该放在什么地方,在Controller中还是单独存放,还有什么是用什么方法获取的?如何进行参数校验首先要明确的是,Controller中不应该有很多逻辑判断代码。为什么?我们可以考虑在参数比较多的时候对各个参数的合理性验证。代码量要大,会严重污染Controller,难以维护。因此,应该有一个合理的机制来提取验证码,从而保证Controller的简洁性。在java世界中,有这样一个概念,叫做JSR,是JavaSpecificationRequests的缩写。它是编程语言Java规范请求或Java语言规范。既然是规范,肯定有各种版本。在JSR-303版本中,提出了BeanValidation验证规范。目前,主要有两个框架实现了BeanValidation规范。一个自带javax.validation.api和hibernate-validator框架,hibernate-validator框架使用比较广泛。.然后我们将使用这个BeanValidation验证框架来进行参数验证@RestController@ValidatedpublicclassBannerController{@GetMapping("/v3/banner")publicMapgetBannerDetailV2(@RequestParamIntegerid,@RequestParam@Max(10)Integerpos){Mapbody=newHashMap<>();body.put("id",id);body.put("位置",位置);返回身体;}}上面的代码中,使用了@Max(10)注解来验证输入参数的pos,输入参数的最大值限制为10,我们运行程序测试一下:访问接口http://localhost:8081/v3/banner?id=12&pos=33后,我们控制台输出提示输入不能超过10,这里的留言不是我写的。这就是java国际化的效果。您可以根据您所在的地区决定显示哪种语言。当然我们也可以在这里自定义错误信息:@GetMapping("/v3/banner")publicMapgetBannerDetailV2(@RequestParamIntegerid,@RequestParam@Max(value=10,message="Exceeded10,快看哇")Integerpos){Mapbody=newHashMap<>();body.put("id",id);body.put("位置",位置);returnbody;}还是上面的请求路径,看控制台输出:可以看到控制台输出了我们自定义的内容。这里需要注意一件事。为了让校验生效,比如在Controller上面添加@Validated注解。至于为什么我们稍后再分解。上面的校验都是比较基础的数据类型,但是如果现在要校验比较复杂的java对象,如何操作,那我们接下来看这部分内容。java对象验证单个对象或使用上面的BannerResponseDto来演示2-10个字符")私有字符串名称;privateIntegerpos;}这些基本类型的成员变量仍然使用这些基本注解来进行校验定义。上面我们使用@Length注解定义了banner名称的字符长度范围,并定义了出现错误时的提示信息。这里需要在Controller中进行额外的处理:@PostMapping("/v3/banner/create")publicBannerResponseDtocreateBanner(@RequestBody@ValidatedBannerCreateDtodto){returnBannerResponseDto.builder()。id(500).name(dto.getName()).pos(dto.getPos()).build();}@ValidatedBannerCreateDto必须注解@Validated,否则无法触发验证机制。嵌套如果某个类的成员变量也是自定义对象,那么验证应该是什么样子的呢?下面我们一起来看看吧。首先定义一个新的对象来接收来自banner的素材信息@Getter@SetterpublicclassMaterialDto{@Length(min=2,max=5,message="素材名称的长度必须在2-5以内")privateStringname;}然后banner对象添加一个成员变量@Setter@GetterpublicclassBannerCreateDto{@Length(min=2,max=4,message="bannernamemustbe2-10characters")privateStringname;私有整数pos;@ValidprivateMaterialDtomaterialDto;}这里有一点,为了让这个级联关系能够触发校验机制,必须打上@Valid注解,我们请求url看看效果可以看到校验失败,然后看控制台输出:输出的是我们定义的错误信息。小结本文主要介绍lombok的使用,验证规范的介绍和验证框架基础注解的使用,以及自定义对象验证。在下一篇文章中,我们将使用自定义注解实现更加个性化的验证规则,敬请期待。欢迎到我的博客看看,还有更多实测内容!!