文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

解读SpringBoot接收List<Bean>参数问题(POST请求方式)

2024-04-02 19:55

关注

接收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注解对属性做映射即可,如下

    
    @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

这样我们就可以实现通过接口直接传递list对象数据。

其中,list中的对象,我们在传参数时只要组织的json格式的数据中,包含该对象的属性以及对应值,接口参数的对象就可以接收到该属性值。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯