在spring中,如果在方法参数列表中使用@requestparam标注多个参数,会让映射方法的可读性大大降低。
如果映射请求的参数只有一两个的话,使用@requestparam会非常直观,但是如果参数列表越来越长,就很容易晕菜。
可以直接使用parameterobject模式来处理【注:parameterobject就是把参数组装成对象】。
如果要传参对数据库操作,则参数对应数据库中的某些字段,此时表对应的entity对象可以直接作为parameterobject。
其他情况下则可以使用一个pojo来包装这些参数,这个pojo本身没有要求额外的注解,但是pojo本身必须包含和请求参数完全匹配的字段2019再见2020你好,标准的tter/getter,和一个无参的构造器:
class productcriteria { private string query; private int offt; private int limit; productcriteria() { } public string getquery() { return query; } public void tquery(string query) { this.query = query; } // other getters/tters}@getmappinglist<product> archproducts(productcriteria productcriteria) { return productrepository.arch(农谚语productcriteria);}
虽然上面的案例已经可以正常使用,但是我们知道,使用@requestparam注解,不仅仅只是为了绑定请求参数,一个非常重要的功能是,我们可以对绑定的参数请求验证,比如参数是否必要,如果请求中缺少该参数,则我们的服务端可以拒绝该请求。
想为我们的pojo中的字段添加验证规则。如果想模仿@requestparam(required = fal)的表现,可以使用@notnull注解在对应的字段上即可。
在更多的情况下,我们一般使用@notblank多于@notnull,因为@notblank考虑了空字符串的情况。
final class productcriteria { @notblank private string query; @min(0) private int offt; @min(1) private int limi; // ...}
这里务必注意一点:
仅仅只是在对象的字段上添加验证注解是不够的。
一定要在controller的方法参数里诶包中,在pojo对应的参数前加上@valid注解。该注解会让spring在绑定参数前执行校验动作。
@getmappinglist<product> archproducts(@valid productcriteria productcriteria) { // ...在这里作文}
@requestparam注解的另一个非常有用的功能就是设置参数的默认值。
如果我们使用pojo的方式来绑定参数,只需要在定义参数的时候设置好字段的默认值就行了。如果请求中没有该参数,spring不会把参数的默认值覆盖为null的。
springmvc我们经常在写controller一般都接受两种方式,一种是form提交,一种是json提交,下面就来介绍如何在这两好先生插曲种方式中将提交的数据自动绑定到自定义对象中。
这个比较简单,在网上搜一下一大把,这里就简单放一段代码:
@requestmapping("/testjson")public string testjson(@requestbody ur ur){ return "ok";}
这个是比较头疼的,一般form有很多的参数,我们可以像下面这样写:
@requestmapping("/test")public string testparam(@requestparam(name = "name") string name, @requestparam(name = "x") string x) { return name + x;}
但是如果我改成下面这样会怎么样?然后用form提交参数 name=zack & x=boy
@requestmapping("/test")public string test(@requestparam(name = "ur") ur ur) { return ur.getname();}
结果是报错:
{
“timestamp”: “2018-05-29t11:58:37.450+0000ͦ年阅兵221;,
“status”: 400,
“error”: “bad request”,
“message”: “required ur parameter ‘ur’ is not prent”,
“path”: “/test1”
}
我的参数里确实是没有ur这个,其实我的原本目的是想让spring把我传递的name和x熟悉拼装好生成一个ur对象,因为刚好ur对象就有这2个属性,spring可没有智能。那该怎么办?
这个时候引入webdatabinder, 在你的controller里加上下面的代码:
@initbinderprotected void initbinder(webdatabinder binder) { binder.registercustomeditor(ur.class, new urformateditor());}public static class urformateditor extends propertieditor { @override public void tastext(string text) throws illegalargumentexception { tvalue(jsonobject.parobject(text, ur.class)); } @override public string getastext() { return getvalue().tostring(); }}
然后在请求时将参数改为 ur = {“name”:”zack”,”x”:”boy”} ,之后就成功的获取ur对象,webdatabinder帮我们告诉了spring,如果遇到了一个字符串参数要被包装成ur.class,用我们自定义的urformateditor就行。
作为规范而言,form提交的方式本身就需要我们一个一个属性的接收,而不能用一个对象统一接收,如果你想用一个对象统一接收,请采用json的方式提交。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。
本文发布于:2023-04-03 21:58:45,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/7bfbc1589487a61ff34da96a0296227d.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Spring的@RequestParam对象绑定方式.doc
本文 PDF 下载地址:Spring的@RequestParam对象绑定方式.pdf
留言与评论(共有 0 条评论) |