
@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 north521 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 nbsp; 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 你这种情况就应该用 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 @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 |