@GetMapping("test")
public void Test(Job example){
System.out.println(example);
}
@RequestParam(required = false)
与@RequestParam(defaultValue = "null")
,均以失败告终,目前临时解决办法是重写了 eqauls 方法
if(example.equals(new Job())){
example = null;
}
判断传进来的实体是否和新 new 出来的空实体 eqauls,从而判断有没有参数,但我感觉这样很 low,请教一下各位大佬有没有更优雅的解决办法
1
sorra 2018-03-26 14:12:01 +08:00
可以直接调用 request 做判断,检查一下 request body 之类的
|
2
yang2yang 2018-03-26 14:19:56 +08:00
目的是判断前台是否传递了这个参数,既然对象一定会 new 出来,那么是不是可以判断 example 对象里面的其他字段是否为 null,进一步来判断有没有传递这个 example 这个参数
|
3
li24361 2018-03-26 14:24:08 +08:00
不要判断对象,判断你需要的字段即可
|
4
LucasLee92 2018-03-26 14:38:21 +08:00
可以用 aop 拦截,用 Objects.equals 做判断,然后判断与 new 的一致,把输出结果变为 null
|
5
LucasLee92 2018-03-26 14:39:27 +08:00
可以考虑加自定义注解和 aop 的方式来定制实现你需要的功能
|
6
seancheer 2018-03-26 14:52:21 +08:00
判断 job 里面的字段就可以了。。不行的话自行自定 interceptor,手动将 url 映射到 controller,然后就可以实现你想要的功能了。
|
7
mosliu 2018-03-26 14:54:52 +08:00
我一般采用字段判断,
好比:Long 类型的 id,判断 id==null 就好。 |
8
DXDE443 OP 谢大佬们回答,感觉 spring 这块设计的不太好啊,我觉得我这个需求应该很正常吧,没传参留 null,竟然挺复杂。。。实体字段比较多而且都是可选参数,特别是部分字段是基本类型(int 什么的)有默认值,通过实体判断代码不少也不太靠谱,分析 request+aop/拦截器应该是可以,但这又得造轮子了。。。想了半天感觉干脆拆成两个 controller 一个带参数一个不带参数还简单点(逃
|
9
pmispig 2018-03-26 18:36:19 +08:00
直接对参数对象进行判断就行了,比如传一个 map 进来,你看下 map 是不是空,是空的话肯定是没传,何必固执一定要空指针...
|
10
azygote 2018-03-26 19:14:56 +08:00 via iPhone
你这里 Job 对象类似一个容器,这个对象的每个字段对应你 get 请求的键值对,这个设计很合理,因为你 get 请求传参数肯定一个参数一个参数中间加&来传的,不存在直接传一个对象过来。
|
11
lastpass 2018-03-26 19:17:33 +08:00 via Android
没有猜错的话(没有仔细研究过 springmvc 源码),
springmvc 也是通过反射泛型来给你进行注入的。。 你要你这个 example 为 null。 那在反射的时候就直接 gg 了。 而且没记错的话 struct2 也是这样的吧。 |
12
DXDE443 OP @lastpass 但这里如果是 Integer 或 String 它就会很聪明的留 null,特别是我加上了 @RequestParam(required=false)后,这个 example 更迷了,无论传什么字段都为 null,但穿 example=123 就会装配到第一个字段,虽然感觉应该是个 bug 但也说明了实现应该是可能的
|
13
zhouyou457 2018-03-26 21:17:01 +08:00 via iPhone
requestmapping 了解一下
|
14
yianing 2018-03-26 21:46:37 +08:00
@zhouyou457 #13 getmapping 好像就是 requestmapping,只不过方式指明了 get
|
15
watzds 2018-03-27 00:37:25 +08:00 via Android
为什么要判断 null 呢,实在需要 Test 里再加一个 bool 参数也行啊
|
16
yanjinbin 2018-03-27 02:09:07 +08:00 via iPhone
没听懂,你的接口设计有问题,spring mvc 会扫描注解,装备。有
|
19
liuzuo 2018-03-27 09:23:08 +08:00
@RequestBody 吧?为啥是 @RequestParam
|
20
domty 2018-03-27 09:36:52 +08:00
ModelAttrinbute 注解?
|
21
Infernalzero 2018-03-27 09:38:43 +08:00 1
你这种情况就应该用 POST,用 GET 的场景这个对象是通过 BeanUtils.instantiateClass 创建的,所以一定会有,如果你写到 body 里就是通过 messageConverter 来转了,这样只要设置 @RequestBody(required = false)就可以了
|
22
lululau 2018-03-27 09:48:31 +08:00
自己配置 ArgumentResolver 吧
|
24
lastpass 2018-03-27 10:37:12 +08:00 via Android
回复 @DXDE443 (以下均为瞎猜)你看 integer 和 string 都是可以直接赋值的呀。不需要进行反射。反射的时候你需要存在这个对象,然后找到这个对象的方法,set 值吧。所以并不是 Integer 或 String 它就会很聪明的留 null。
|
25
LucasLee92 2018-03-27 10:43:02 +08:00
@Infernalzero
大佬,想系统学习 spring,看哪本书比较好,还是说得去看源码吗? |
26
johnj 2018-03-27 10:50:35 +08:00 1
@LucasLee92 官方文档不错
|
27
DXDE443 OP @mgcnrx11 我的实体类是用 idea 的 jpa 工具生成的,这个工具 not null 的字段都会被映射成基本类型,我个人没找到哪里有设置不生成基本类型,一个一个改就太麻烦了
|
28
vjnjc 2018-03-27 12:04:05 +08:00
#24 楼说得对,string 和 Integer 无法反射赋值,所以是 null。
一般的 object 都是先构造,再把每个参数反射注入。 你的情况就是构造好了后没有参数可以注入,程序结束。 以上情况都是 @RequestMapping,你要不用 @ModelAttribute 吧 |
29
DXDE443 OP @domty 试了下并没有发现有什么用额,但如果配合 requestparam(required=false)这个 example 就永远为 null 了,穿什么都不好使
|
30
DXDE443 OP 我 requestparam 注解确实用错了,但 requestbody 那前台就要穿 json 了吧,这改动稍微有点大
|
31
seaswalker 2018-03-27 14:00:23 +08:00
我觉着可以尝试自定义 HandlerMethodArgumentResolver,比如继承 RequestResponseBodyMethodProcessor
|