【问题标题】:ajax json Post to Spring mvc Controller "415 Unsupported Media Type"ajax json 发布到 Spring mvc 控制器“415 不支持的媒体类型”
【发布时间】:2015-10-13 23:25:42
【问题描述】:

您好,我在将 JSON 从表单中获取到使用 spring mvc 工作时遇到问题。我的表单是动态的,JSON 作为用户在表单上填写的条件列表返回。理想情况下,我希望能够将 JSON 作为包含 Criteria 对象列表的 Criterias 对象。 (就像我下面的模型类)我不知道这是否可能,或者是否有不同的方法可以解决它,但任何建议都将不胜感激。

**目前我收到来自 ajax 帖子的 415 不受支持的媒体类型。

控制器

@RestController   
public class Controller {
@RequestMapping(value-"/test",method=RequestMethod.GET
public ModelAndView getTest(){

ModelAndView model = new ModelAndView("test");

}
@RequestMapping(value-"/query",method=RequestMethod.POST
public ModelAndView submitTest(@RequestBody Criterias criterias){

//do stuff....
ModelAndView model = new ModelAndView("results");

}

型号

public class Criterias{
private List<Criteria> criteria = new ArrayList<Criteria>();
getter setter...
}

public class Criteria{
private String field;
private String filter;
private String operator;
private String criteria;


getters setters...
}

TEST.JSP

$(document).ready(function() {
  $("#theButton").click(function() {
    $('#myTable').append("<tr><td><select name = 'operator'><option>AND</option><option>OR</option></select></td><td>Field:<select name='field'><option>a</option><option>b</option> <option>c</option> <option>d</option> </select> </td> <td> <select name='filter'>  <option>Contains</option> <option>Does Not Contain</option> <option>Equals</option> <option>Does Not Equal</option> </select> </td><td>  <input name='criteria' type='text'> </td><td><button type ='button' class ='rm' title = 'Remove Row'/></td></tr>")
  });
  $("#myTable").on('click', '.rm', function() {
    $(this).parent().parent().remove();
  });
});

function post() {

  $.ajax({
    type: "POST",
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    url: "query",
    data: JSON.stringify($('form').serializeArray())

  })

};
<html>

<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
</head>

<form>

  <table>
    <tbod>
      <tr>
        <td>Field:
          <select name='field'>
            <option>a</option>
            <option>b</option>
            <option>c</option>
            <option>d</option>
          </select>
        </td>
        <td>
          <select name='filter'>
            <option>Contains</option>
            <option>Does Not Contain</option>
            <option>Equals</option>
            <option>Does Not Equal</option>
          </select>
        </td>
        <td>
          <input name='criteria' type='text'>
        </td>
      </tr>
    </tbod>
  </table>
  <table id='myTable'>
    <tbody>
    </tbody>
  </table>

  <input type="button" value="search" onclick="return post();">
  <input type="button" id="theButton" value="Add Criteria">

</form>

更新

我试图做一些更简单的事情来缩小问题范围,从我查找的内容来看,这似乎是杰克逊映射的问题。以下代码也会产生 415 错误。

控制器

@RestController
public class Rest{
@RequestMapping(value="/testModel",method=RequestMethod.GET)
public ModelAndView getTestModel(){
   return new ModelAndView("testModel");
}

 @RequestMapping(value="/sendTestModel",method=RequestMethod.POST)
 public String submiteTestModel(@RequestBody TestModel test){
   return test.getName();
 }
 }

型号

public class TestModel{

private String id;
private String name;

//getters setters....
}

testModel.jsp

function post() {

    $.ajax({
          headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json'
          },
          type: "POST",
          contentType: 'application/json;,
    dataType: '
          json ',
    url: "sendTestModel",
    data: JSON.stringify({id:"1",name:"Bob"})

  })

};
<Html>
<input type="button" value="search" onclick="return post();"/>
</Html>

【问题讨论】:

    标签: jquery json ajax spring spring-mvc


    【解决方案1】:

    调用JSON.stringify($('form').serializeArray()) 会给你以下字符串

    [{"name":"field","value":"a"},{"name":"filter","value":"Contains"},{"name":"criteria","value":""}]

    这是documentationserializeArray()

    显然,这对于期望 Criterias 对象的 JSON 表示的 @RestController 是不可接受的。你的 JSON 字符串应该看起来像

    {"criteria":[{"field":"a","filter":"Contains"},{"field":"Some other field value","filter":"Some other filter value"}]}

    我已经为你做了一个简单的函数:

    function convertCriterias(json){
        var o = new Object();
        var criterias = [];
        var c = new Object();
    
        for(var i = 0; i < json.length; i++){
            c[json[i].name] = json[i].value;
        }
    
        criterias[0] = c;
    
        o.criteria = criterias;
    
        return JSON.stringify(o);
    }
    

    只需将JSON.stringify($('form').serializeArray()) 替换为convertCriterias($('form').serializeArray())

    编辑

    我相信您打算使用 input type="button" 而不是 input type="submit" 来向您的 @RestController 发送 AJAX 帖子。您的意思是在按钮的 onclick 事件中调用 return work() 而不是 return post

    【讨论】:

    • 您的函数似乎只获取一个标准组,因此没有返回 {"criteria":[{"field":"a","filter":"Contains"},{"field" :"Some other field value","filter":"Some other filter value"}]} 它只返回在我的表单上选择的任何内容的最后一行。就像这样 {"criteria":[{field names and values}]}
    • 这是因为您的表单中只有一个字段和一个过滤器。如果serializeArray 返回多个字段和多个过滤器,它们将被放入返回的 JSON 字符串中。至于您的主要问题,请告诉我我是否向您解释清楚您从请求中获得415 unsupported Media Type 的根本原因。
    • 我的表单中的字段和过滤器不止于此?如果您运行代码 sn-p 您将看到,如果您单击添加条件,它将向表单添加新的字段过滤器和值。我尝试回溯并尝试查看是否可以仅将一个对象映射到我的 JSON,但仍然收到 415 unsupported Media Type 错误
    • 这是我尝试过的 JSON,我将它硬编码到 ajax 调用中的数据中,如下所示..... JSON.stringify({"operator":"","field":"Text" ,"filter":"contains","value":"hello"}) 并且我将控制器更改为 Criteria Crit 而不是 Criteria[] Crit,但仍然无法将其映射。
    • 我知道这是一个映射问题,因为如果我将控制器更改为 String Crit,那么它将带入 JSON 并将其存储在字符串中。
    【解决方案2】:

    尝试以下选项:

    • 在控制器的 RequestMapping 中添加您想要生成的内容类型。查看Producible Media Types documentation 了解更多信息。

      @ResponseBody @RequestMapping(value="/query", method=RequestMethod.POST,produces="application/json")

    • 在您的 jQuery Ajax 调用中明确指定 Accept 请求标头,而不仅仅是 Content-Type 标头:

      $.ajax({
      标题:{
      接受 : "application/json; charset=utf-8",
      “内容类型”:“应用程序/json;charset=utf-8”
      },.. })

    【讨论】:

    • 感谢您的回答,但我仍然收到相同的 415 错误。
    猜你喜欢
    • 2013-08-08
    • 2023-03-04
    • 2017-05-20
    • 2014-11-04
    • 2017-02-10
    • 2014-02-16
    • 1970-01-01
    • 2013-01-04
    • 2015-12-16
    相关资源
    最近更新 更多