【问题标题】:400 bad request while sending data with ajax in spring framework在 Spring 框架中使用 ajax 发送数据时出现 400 错误请求
【发布时间】:2019-08-28 11:44:54
【问题描述】:

试图将 JavaScript 对象传递给 Spring MVC。我收到 400 错误请求错误。尝试了所有不同的方法,但仍然没有运气。我已经附加了控制器,我在 JS 和 Java 中传递的对象以及响应。将不胜感激任何帮助。当我将 @RequestBody 更改为 @ModelAttribute 时,我在控制器中收到参数,但整数为零且数组为空。

控制器

    @RequestMapping(value="/getInstrumentsByTypeMakeModel" , method=RequestMethod.GET)
    public @ResponseBody List<Instrument> getInstrumentsByTypeMakeModel(@RequestBody SearchInstrument search) {
     // do Something and create searchResult;   
    return searchResult;
}

JavaScript

var searchInstrument = {

    operator: siteOperator,
    companyId:loggedInUserCompanyId ,
    isServiceProvider:isServiceProvider ,
    types:selectedType,
      makes:selectedMake,
      models:selectedModel,
      typeOthers:selectedTypeOther,
      makeOthers:selectedMakeOther,
      modelOthers:selectedModelOther

    };



     jQuery.ajax({
         url:server_name+ "/getInstrumentsByTypeMakeModel",
         type: "GET",
        dataType: "JSON",
        data:JSON.stringify(searchInstrument),   
         contentType: 'application/json; charset=utf-8',
         success: function(resultData) {
             console.log(resultData);
            },
             error: function(jqXHR, status) {
                 // error handler

            }
        }); 

搜索工具类

public class SearchInstrument  {
    public SearchInstrument(){

    }

        public SearchInstrument(int operator,int companyId, boolean isServiceProvider,
                List<Integer>  types,List<Integer>  makes,  List<Integer>  models,
                List<String>  typeOthers,List<String>  makeOthers,List<String>  modelOthers
                ){

this.operator=operator;
this.companyId=companyId;
this.types=types;
this.makes=makes;
this.models=models;
this.typeOthers=typeOthers;
this.makeOthers=makeOthers;
this.modelOthers=modelOthers;
        }
        private int operator;
        private int companyId;
        private boolean isServiceProvider;
        private List<Integer>  types=new ArrayList<Integer> ();
        private List<Integer>  makes=new ArrayList<Integer> ();
        private List<Integer>  models=new ArrayList<Integer> ();    
        private List<String>  typeOthers=new ArrayList<String> ();
        private List<String>  makeOthers=new ArrayList<String> ();
        private List<String>  modelOthers=new ArrayList<String> ();

//getters and setters       

    }

[这是参数][https://i.stack.imgur.com/2cxde.png]

[这是网址:][https://i.stack.imgur.com/BPMaS.png]

【问题讨论】:

  • API 中的堆栈跟踪是什么?有什么错误吗?
  • @Christos K 如果我使用 RequestBody 它甚至不会命中控制器,但是当我像这样将其更改为 ModelAttribute 时,会收到参数但数组为空且整数为零

标签: javascript ajax spring model-view-controller bad-request


【解决方案1】:

我不完全确定,但结合 GET 请求并尝试传递一个对象似乎不是最好的主意,这就是为什么你在第二个 URL 上看到你的 searchController JS 对象的原因图片。

下面question有更透彻的解释。

我认为您应该尝试将其转换为 POST 请求。

或者,如果您出于自己的原因仍希望将其保留为 GET,则应将对象作为 URL 中的参数传递并在控制器中使用 @RequestParam。

【讨论】:

  • 我将其更改为 POST 并且它有效。这很奇怪,因为我之前尝试过 POST,但可能使用的是 RequestParam 而不是 RequestBody。非常感谢。
  • 我还将 SearchController 类名称更改为 SearchInstrument 以避免与控制器类相似。
  • 另外需要注意的是 SearchInstrument 不能是控制器的内部类,除非它是静态的。如果你把它作为一个内部类而不是静态的,你会得到“没有默认构造函数”
猜你喜欢
  • 1970-01-01
  • 2016-01-06
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多