Spring的@RequestParam对象绑定

摘要:
在Spring中,如果使用@RequestParam标记方法参数列表中的多个参数,映射方法的可读性将大大降低。如果映射请求只有一个或两个参数,使用@RequestParam将非常直观,但如果参数列表越来越长,则很容易混淆。如果要模仿@RequestParam的性能,可以在相应字段上使用@NotNull注释。此注释将导致Spring在绑定参数之前执行验证@GetMappingList<Product>searchProducts{//…}@RequestParam注释的另一个非常有用的功能是设置参数的默认值。

在Spring中,如果在方法参数列表中使用@RequestParam标注多个参数,会让映射方法的可读性大大降低。

如果映射请求的参数只有一两个的话,使用@RequestParam会非常直观,但是如果参数列表越来越长,就很容易晕菜。

解决方案:

可以直接使用ParameterObject模式来处理【注:ParameterObject就是把参数组装成对象】。

如果要传参对数据库操作,则参数对应数据库中的某些字段,此时表对应的entity对象可以直接作为ParameterObject。

其他情况下则可以使用一个POJO来包装这些参数,这个POJO本身没有要求额外的注解,但是POJO本身必须包含和请求参数完全匹配的字段,标准的setter/getter,和一个无参的构造器:

class ProductCriteria {
   private String query;
   private int offset;
   private int limit;

   ProductCriteria() {
   }
   public String getQuery() {
       return query;
   }
   public void setQuery(String query) {
       this.query = query;
   }
   // other getters/setters
}
@GetMapping
List<Product> searchProducts(ProductCriteria productCriteria) {
   return productRepository.search(productCriteria);
}

在POJO中对请求参数进行校验

虽然上面的案例已经可以正常使用,但是我们知道,使用@RequestParam注解,不仅仅只是为了绑定请求参数,一个非常重要的功能是,我们可以对绑定的参数请求验证,比如参数是否必要,如果请求中缺少该参数,则我们的服务端可以拒绝该请求。

想为我们的POJO中的字段添加验证规则。如果想模仿@RequestParam(required = false)的表现,可以使用@NotNull注解在对应的字段上即可。

在更多的情况下,我们一般使用@NotBlank多于@NotNull,因为@NotBlank考虑了空字符串的情况。

final class ProductCriteria {

   @NotBlank
   private String query;
   @Min(0)
   private int offset;
   @Min(1)
   private int limi;

   // ...

}

这里务必注意一点:

仅仅只是在对象的字段上添加验证注解是不够的。

一定要在controller的方法参数里诶包中,在POJO对应的参数前加上@Valid注解。该注解会让Spring在绑定参数前执行校验动作。

@GetMapping
List<Product> searchProducts(@Valid ProductCriteria productCriteria) {
   // ...
}

@RequestParam注解的另一个非常有用的功能就是设置参数的默认值。

如果我们使用POJO的方式来绑定参数,只需要在定义参数的时候设置好字段的默认值就行了。如果请求中没有该参数,Spring不会把参数的默认值覆盖为null的。

免责声明:文章转载自《Spring的@RequestParam对象绑定》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Git官网下载windows版本慢的问题2019 家居云java面试笔试题 (含面试题解析)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

爱快路由器的一些注意事项硬件配置+多线负载均衡

以下数据仅供参考:注意:磁带载体的数量因使用环境和带宽大小的不同而不同。此外,请注意32位系统的安装。最大内存为4G,最大内存为3G-----硬盘------安装“爱快路由”时对硬盘的最低要求为1G以上。...

Django如何安装指定版本

Django的最新版本默认安装为:pipinstalldjangoDjango,然后是版本号:pipinstalldjango==1.11.7如果使用pipinstall库的安装速度较慢,您可以使用豆瓣的图片:pipinstalldjango==1.11.7-ihttp://pypi.douban.com/simple--trusted-hostpypi.d...

前端导航站点(PC端)

本篇LIST1.项目预览地址:项目预览地址2.项目完成效果:3.HTML布局拆分1.tip提示部分2.title标题部分3.搜索栏部分找的是codepen上现成的搜索框样式,包含搜索框展开收缩的特效。...

隔板法

分区法用于将n个球变成m个盒子:(1)不允许为空:n个球放在m个盒子中,而n-1个球是通过用m-1个分区分隔n个球来放置的,因此Cn-1,m-1(2)可以为空:m个盒子里放n个球,可以为空。首先想象m个球被放置在m个盒子中,每个盒子一个,然后手中的n个球被分配到m个盒子。此时,箱子不能为空。此时,我们使用n+m个球,如果我们取出m个球的话,我们可以得到n个球...

高通平台UEFI有关介绍

高通平台UEFI有关介绍背景我需要在高通平台上学习点亮LCD,目前通过同事在别的平台的配置代码,我已经将kernel部分的屏幕点亮了;剩余的工作量就在BP侧,也就是系统刚开机的那一段时间。有关文档:https://www.cnblogs.com/we-hjb/p/9800627.htmlhttps://blog.csdn.net/u014089131/art...

HBuilder控制台打开方式

今天,我关闭了Hbuilder的控制台,找不到打开它的位置,!!...