2015-10-13 79 views
0

嗨,所以我有问题从我的表单获得JSON与我的工作与春天mvc。我的表单是动态的,JSON返回为用户在表单上填写的条件列表。理想情况下,我希望能够通过包含Criteria对象列表的Criterias对象来获取JSON。 (就像我的模型类下面)我不知道这是可能的,或者如果有不同的方式去了解它,但任何建议将不胜感激。ajax json发布到春季mvc控制器“415不支持的媒体类型”

**目前,我正在从ajax帖子收到415个不受支持的媒体类型。

CONTROLLER

@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"); 

} 

MODEL

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>

UPDATE

我试图做一些更简单的事情来缩小这个问题,从我查过的东西看来,它似乎是杰克逊映射的问题。以下代码也会产生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(); 
} 
} 

MODEL

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>

回答

1

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

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

这里是documentationserializeArray()

显然,这不是一个@RestController一个期望的JSON表示接受Criterias对象。你的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); 
} 

只是convertCriterias($('form').serializeArray())

编辑替换JSON.stringify($('form').serializeArray())

我相信你打算使用input type="button"而不是input type="submit"来为你的@RestController做一个AJAX帖子。而你打算在按钮的onclick事件中调用return work()而不是return post

+0

它看起来像你的函数只捕获一个标准组,所以不是返回{“标准”:[{“field”:“a”,“filter”:“Contains”},{“field”:“其他字段值” ,“filter”:“一些其他的过滤器值”}]} 它只返回我的表单上选择的最后一行。所以像这样{“criteria”:[{field name and values}]} –

+0

这是因为您的表单中只有一个字段和一个过滤器。如果'serializeArray'返回许多字段和许多过滤器,它们将被放入返回的JSON字符串中。至于你的主要问题,让我知道我是否清楚地向你解释了为什么你从你的请求中获得'415不支持的媒体类型'的根本原因。 – Bnrdo

+0

我的表单中有超过字段和过滤器吗?如果你运行代码片段,你会看到如果你点击添加条件,它会为表单添加新的字段过滤器和值。我试着回溯,并试图看看我是否可以只将一个对象映射到我的JSON,而我仍然收到415不受支持的媒体类型错误 –

0

尝试下列选项:

  • 添加在您的控制器的RequestMapping你想获得产生的内容类型。看看Producible Media Types documentation了解更多信息。

    @ResponseBody @RequestMapping(值= “/查询”,方法= RequestMethod.POST,产生= “应用/ JSON”)

  • 明确指定接受请求头不仅仅是内容类型头在你的jQuery Ajax调用:

    $阿贾克斯({
    标题:{
    接受: “应用/ JSON的;字符集= UTF-8”,
    “内容类型”:“应用程序/ JS上; charset = utf-8“
    },..})

+0

谢谢你回答,但我仍然收到相同的415错误。 –

相关问题