首頁 > 軟體

解讀SpringBoot接收List<Bean>引數問題(POST請求方式)

2022-09-24 14:02:02

接收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格式的資料中,包含該物件的屬性以及對應值,介面引數的物件就可以接收到該屬性值。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com