2015-10-13 105 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錯誤。 –

相關問題