请教大佬们一个关于 springmvc 的一个简单问题

2018-03-26 11:58:16 +08:00
 DXDE443
@GetMapping("test")
public void Test(Job example){
    System.out.println(example);
}

对于这样一个 controller,我想要接受 example 这样一个可选实体参数,我希望前台传这个参数时,我可以正常接收到这个参数,前台不穿这个参数时,我希望这个参数为 null,但 springmvc 的逻辑是,不管前台是否穿了参数,都会 new 一个对象传进来,这样我就不好判断前台是否穿了这个参数,我尝试了@RequestParam(required = false)@RequestParam(defaultValue = "null"),均以失败告终,目前临时解决办法是重写了 eqauls 方法

if(example.equals(new Job())){
    example = null;
}
判断传进来的实体是否和新 new 出来的空实体 eqauls,从而判断有没有参数,但我感觉这样很 low,请教一下各位大佬有没有更优雅的解决办法
4621 次点击
所在节点    Java
31 条回复
Infernalzero
2018-03-27 09:38:43 +08:00
你这种情况就应该用 POST,用 GET 的场景这个对象是通过 BeanUtils.instantiateClass 创建的,所以一定会有,如果你写到 body 里就是通过 messageConverter 来转了,这样只要设置 @RequestBody(required = false)就可以了
lululau
2018-03-27 09:48:31 +08:00
自己配置 ArgumentResolver 吧
paragon
2018-03-27 09:54:44 +08:00
@domty 看了这么多 终于有正确答案了~
lastpass
2018-03-27 10:37:12 +08:00
回复 @DXDE443 (以下均为瞎猜)你看 integer 和 string 都是可以直接赋值的呀。不需要进行反射。反射的时候你需要存在这个对象,然后找到这个对象的方法,set 值吧。所以并不是 Integer 或 String 它就会很聪明的留 null。
LucasLee92
2018-03-27 10:43:02 +08:00
@Infernalzero
大佬,想系统学习 spring,看哪本书比较好,还是说得去看源码吗?
johnj
2018-03-27 10:50:35 +08:00
@LucasLee92 官方文档不错
DXDE443
2018-03-27 11:52:44 +08:00
@mgcnrx11 我的实体类是用 idea 的 jpa 工具生成的,这个工具 not null 的字段都会被映射成基本类型,我个人没找到哪里有设置不生成基本类型,一个一个改就太麻烦了
vjnjc
2018-03-27 12:04:05 +08:00
#24 楼说得对,string 和 Integer 无法反射赋值,所以是 null。
一般的 object 都是先构造,再把每个参数反射注入。
你的情况就是构造好了后没有参数可以注入,程序结束。

以上情况都是 @RequestMapping,你要不用 @ModelAttribute
DXDE443
2018-03-27 12:11:01 +08:00
@domty 试了下并没有发现有什么用额,但如果配合 requestparam(required=false)这个 example 就永远为 null 了,穿什么都不好使
DXDE443
2018-03-27 12:18:26 +08:00
我 requestparam 注解确实用错了,但 requestbody 那前台就要穿 json 了吧,这改动稍微有点大
seaswalker
2018-03-27 14:00:23 +08:00
我觉着可以尝试自定义 HandlerMethodArgumentResolver,比如继承 RequestResponseBodyMethodProcessor

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/441429

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX