解读SpringBoot接收List<Bean>参数问题(POST请求方式)
作者:小狐狸和小兔子
接收List<Bean>参数问题(POST请求方式)
接部门排序后,前端已经返回了我们想要的数据格式(采用FormData方式),但是后台一直迟迟无法接收到我想要的(不想用json字符串来接收,还得转),一脸问号,这是什么操作?一定是姿势不对
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:226)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:157)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:130)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:124)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:131)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:981)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:884)
看过很多文章,有的说建立一个实体类,把list对象放进去当成属性,然后会自动映射赋值,但那样有点麻烦,不想弄
上述异常的最终解决方案为前端Ajax请求时,添加contentType即可
jQuery.ajax({ async: false, cache: false, type: 'POST', //添加 contentType: "application/json; charset=utf-8", dataType: 'json', data: JSON.stringify(paramData), url: '...', error: function () { }, success: function (data) { //console.log(data) } });
后台使用@RequestBody注解对属性做映射即可,如下
/** * 修改部门排序 * * @param request * @param depts * @return */ @PostMapping(value = "/sort") public DDResult updateDeptTreeSort(HttpServletRequest request, @RequestBody List<Dept> depts) { return DDResult.success(deptService.updateDeptTreeSort(depts)); }
尝试过用如下方式传递,然鹅还是失败了
dept[0].id:10
dept[0].pid:null
dept[0].order:0
dept[1].id:20
dept[1].pid:null
dept[1].order:1
springboot接口参数为List
简单接口参数
springboot接口访问,如果是走http请求,那么参数会默认转换成键值对格式,或者是json字符串形式的。
今天就遇到一个场景,我需要一个list结构的参数,list里面又是对象,那我们该怎么传参呢?
我们不能再浏览器上直接拼接参数发请求了,例如:
这样的格式是不被允许的,请求会报错。
那么我们转换思路,既然是json格式的参数,那我们就传json格式
设置headers
Content-type 的值为application/json
组织传值参数list数据
在body中,传值参数,list 使用[]括起来
代码实现请求
public void queryLiveCourseInfoTest(){ JSONArray jsonArray = new JSONArray(); JSONObject json1 = new JSONObject(); json1.put("dn","123"); json1.put("bossCode","34455"); jsonArray.add(json1); JSONObject json2 = new JSONObject(); json2.put("dn","234"); json2.put("bossCode","66666"); jsonArray.add(json2); String arr = jsonArray.toJSONString(); System.out.println("请求参数:"+arr); String url = nativUrl+""; try { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); headers.setContentType(type); HttpEntity<ElecMeterDataApi> entity = new HttpEntity<ElecMeterDataApi>(arr,headers); String res = restTemplate.postForObject(url, entity, String.class); log.info("结果:"+res); } catch (RestClientException e) { log.error("请求异常" + e.getMessage()); } }
controller层设置两个注解
@ResponseBody 和@RequestBody
@ResponseBody
没有该注解的时候,会发生postman 请求找不到error 404;@RequestBody
没有该注解的时候,会发生参数值传输不过去;
这样我们就可以实现通过接口直接传递list对象数据。
其中,list中的对象,我们在传参数时只要组织的json格式的数据中,包含该对象的属性以及对应值,接口参数的对象就可以接收到该属性值。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。