【Java】springboot中的@DeleteMapping注解无法获取参数值
最近在试试使用springboot编写一个demo进行测试,测试过程中发现@DeleteMapping注解有一些问题,现在汇总如下,有大神指点一下
示例1:
问题:无法获取参数id的值
@DeleteMapping(value = "userinfo")public void deleteUserinfo(Integer id) {
System.out.println("========= id : " + id);
this.dao.delete(id);
}
在spring-mvc中,经常使用上面的方法获取参数,无论是get还是post方法都可以获取的到,但是在springboot中这种写法得到的id却是null,然后方法就抛出异常,因为delete方法的参数值不能为null;
为什么这种方式获取不到参数值呢?
示例2:
问题:无法执行方法,无法获取参数值
@DeleteMapping(value = "userinfo3")public void deleteUserinfo3(@RequestParam("id") int id) {
System.out.println("========= id : " + id);
this.dao.delete(id);
}
在postman中进行的测试,无论是 form-data还是x-www-form-unlencoded类型,都无法进入方法体,连第一句打印都不执行,直接报400的错误,错误信息如下
{"timestamp": 1505653583069,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.web.bind.MissingServletRequestParameterException",
"message": "Required int parameter 'id' is not present",
"path": "/userinfo/userinfo3"
}
很不理解,put方法可以通过修改x-www-form-unlencoded方式,然后通过@RequestParam方法获取参数值,但是delee却不行,不知为何
示例3:
问题:获取不到参数值
@DeleteMapping(value = "userinfo4")public void deleteUserinfo4(Userinfo userinfo) {
System.out.println(userinfo);
this.dao.delete(userinfo);
}
在post方法中可以使用entity来接受参数,但是delete方法却不行;
上面方法虽然可以执行到方法里面,第一行打印也有内容,但是userinfo对象是空的,没有获取到任何参数,不知为何!
后台日志如下:
{"age":0,"id":0}Hibernate: insert into userinfo (age, cup_size, name) values (?, ?, ?)
Hibernate: delete from userinfo where id=?
极其匪夷所思,我只是执行了一个delete操作,为什么日志会打印insert into 语句呢?
示例4:
问题 : 无法获取参数值,方法直接进不到方法体中
@DeleteMapping(value = "userinfoMap")public void deleteUserinfoMap(@RequestBody Map<String, String> map) {
System.out.println(map);
}
示例5:
@DeleteMapping(value = "userinfo/{id}")public void deleteUserinfo2(@PathVariable("id") int id) {
System.out.println("========= id : " + id);
this.dao.delete(id);
}
上面的5个例子,只有这种情况下,通过restful的方法才能获取deletemapping的参数值,实在是费解。
另外的一个问题 :
在示例5中,delete操作竟然不能执行2次,当第二次执行的时候,由于数据已经被删除,导致程序直接抛出异常,错误信息如下
{"timestamp": 1505654465700,
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.dao.EmptyResultDataAccessException",
"message": "No class com.zzg.springboot.firstbootweb.entity.Userinfo entity with id 2 exists!",
"path": "/userinfo/userinfo/2"
}
回答
情况5中的 @PathVariable
注解是从请求路径中获取值,与 RequestBody
无关,所以能取到。
@DeleteMapping
注解的参数其实有办法取到,方法的参数加个 @RequestBody
注解,这样就是直接获取整个原始请求体,就要你自己解析了。
postman的话,body类型设置为raw即可:
搜索了一下网上的资料
这是一种做法,但是我不清楚这适不适合你。
记得很久以前看到过关于这个问题的说明,好像是说 Spring 的 @RequestMapping
对 GET/POST
以外的请求方式没有做完整的解析,当时那篇文章说要自己手动实现,现在找不到那篇文章了,也可能是我记忆有误。
然后关于你 情况5 的 "二次删除数据报错"
你的确是已经删除了id为2的数据啊,怎么可能再删除得了呢?
你可以把delete操作catch起来,检查是否为这个已知异常,是的话传回错误信息 "id 不存在"
很好,这个坑今天被我踩到了,接收到的参数变成null 是因为
这个value属性,把它干掉就可以接收到数据了。具体什么原因我还没来得及看,我也是对比了好久才试出来的
不知道楼主有没有解决
用 x-www-form-uilencodeded 是可以的
使用@requestBody注解后,并没有解决该问题
楼主解决了吗,我传的是一个UserList的一个id串,PostMan我用x-www-form-uilencodeded传的,后端用的@deleteMapping然后接收不到参数
以上是 【Java】springboot中的@DeleteMapping注解无法获取参数值 的全部内容, 来源链接: utcz.com/a/87103.html