【问题标题】:Passing in JSON array to spring MVC Controller将 JSON 数组传递给 Spring MVC 控制器
【发布时间】:2014-03-17 01:12:06
【问题描述】:

我正在尝试将 JSON 数组传递给 Spring MVC 控制器,如下所示:

 var myList = new Array(); 
data._children.forEach( function (d) { 
                        myList.push( {NAME: d.name, TYPE: d.TYPE, FDATE: d.FDATE } );
                    });

 $.post("/ListRequest", {myList: myList});

控制器如下所示:

 @RequestMapping(value="/ListRequest", method = RequestMethod.POST)
    public void ListRequest(@RequestParam("myList") myList tempmyList )
    {
        System.out.println(tempmyList);
    }

类myList定义如下:

public class MyList {
    private List<ListT> ListT;
    public List<ListT> getListT() {
        return ListT;
    }

    public void setListT(List<ListT> listT) {
        ListT = listT;
    }

}

ListT 类:

public class ListT {
    private String NAME;
    private String TYPE;
    private Long FDATE; ...

我不断收到此错误: HTTP 状态 400 - 所需的 myList 参数“myList”不存在

也试过这个请求:

$.ajax({
                type: "post",
                url: "ListRequest", //your valid url
                contentType: "application/json", //this is required for spring 3 - ajax to work (at least for me)
                data: JSON.stringify(myList), //json object or array of json objects
                success: function(result) {
                    //do nothing
                },
                error: function(e){
                    alert('failure');
                }

但是得到这个错误:JBWEB000120:客户端发送的请求在语法上不正确。

【问题讨论】:

  • 打开浏览器的网络控制台并检查请求中实际写入的 JSON。把它贴在这里。此外,您需要使用@RequestBody 而不是@RequestParam。我会让你查一下原因。
  • 我尝试了@RequestBody,但收到了不支持的媒体类型错误。 JSON也看起来像这样: {"myList":[{"NAME":"Blah","TYPE":"TYPE1","DATE":1385874000000}]}
  • 更改您的 AJAX 请求以将内容类型发送为 application/json
  • 试过这个,但仍然得到不受支持的媒体类型:$.post("/ListRequest", {myList: myList}, 'application.JSON') 也试过$.post("/ListRequest", {myList: myList}, 'JSON')
  • 您必须编写您的类,使其与 JSON 匹配,反之亦然。 Spring 在幕后使用 jackson,因此请弄清楚应该如何完成映射并在需要时对其进行修复。

标签: json spring spring-mvc


【解决方案1】:

你可以试试

@RequestParam("myList") myList tempmyList


@Param myList tempmyList

此外,类名必须以大写字母开头。

【讨论】:

  • 你改变了什么? @Param 是什么?类名不能以大写字母开头,它们应该以大写字母开头。
  • 修正了大写,对此感到抱歉。
【解决方案2】:

尝试将此添加到您的 ajax 调用中,它应该修复不受支持的响应:

headers : {
    'Accept' : 'application/json',
    'Content-Type' : 'application/json'
},

这是对我有用的 ajax 调用的完整示例:

$.ajax({
            dataType : "json",
            url : this.baseurl + "/dataList",
            headers : {
                'Accept' : 'application/json',
                'Content-Type' : 'application/json'
            },
            data : JSON.stringify(params),
            type : 'POST',
            success : function(data) {
                self.displayResults(data);
            },
            error : function(jqXHR,textStatus,errorThrown ){
                showPopupError('Error','error : ' + textStatus, 'ok');
            }
        });

【讨论】:

  • 原来我收到了 404 错误,因为控制器没有返回任何内容,但请求实际上是完全正确的。
  • 我想使用这个线程中引用的技术。我的 Ajax 调用指定了 contentType: 'application/json'dataType: 'json'data: {"values":JSON.stringify(['String1','String2','String3'])}。在我的控制器中,我将控制器方法参数注释为@RequestParam List&lt;String&gt; valuesList。调用了控制器方法,但是当我检查valuesList 中的值时,我看到:["String1""String2""String3"]!我做错了什么?!
  • 好像您使用的是 GET,我没有使用 @RequestParam 进行反序列化,请尝试在帖子中向您发送数据并在您的控制器中使用 @RequestBody
【解决方案3】:

即使我也面临同样的问题。 我的客户请求是正确的,并生成了正确的 json 文件。 但我仍然遇到同样的错误。

我在 pojo 类中使用 @JsonIgnoreProperties(ignoreUnknown = true) 解决了这个错误。

参考这个链接。 Spring MVC : The request sent by the client was syntactically incorrect

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多