[英]Spring MVC @RequestBody JSON
我收到一個錯誤,客戶端發送的請求在語法上是不正確的。 做錯了什么? 這是我的代碼:
@Entity
@Table(name = "display")
public class Display {
private String diagonal;
private String aspectRatio;
//getter and setter
}
$.ajax({
type:'POST',
url:'/admin/updateDisplay',
data:{'diagonal':"sss"}
})
@Controller
@RequestMapping(value = "/admin")
public class AdminController {
@RequestMapping(value = "/updateDisplay", method = RequestMethod.POST)
public String updateDisplay(@RequestBody Display display){
System.out.print(display);
return null;
}
}
我想你需要說明服務媒體類型將為Spring消耗什么,以便知道如何解組它。 可能是application/json
。
@RequestMapping(value = "/updateDisplay", method = {RequestMethod.POST},
consumes = {"application/json"})
可能還有一些Json圖書館,就像傑克遜一樣。
使用以下內容:
$.ajax({
type:'POST',
url:'/admin/updateDisplay',
data:{"diagonal":"sss","aspectRatio":"0.5"},
contentType: 'application/json',
dataType: 'json',
})
有用。
編輯
如果您使用注釋啟動Spring應用程序上下文,那么您的配置類必須具有:
@Override
protected void configureContentNegotiation(
ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false).favorParameter(true)
.parameterName("mediaType").ignoreAcceptHeader(true)
.useJaf(false).defaultContentType(MediaType.APPLICATION_JSON)
.mediaType("xml", MediaType.APPLICATION_XML)
.mediaType("json", MediaType.APPLICATION_JSON);
}
你的ajax請求必須包含
contentType: 'application/json',
dataType: 'json',
檢查上面修改過的ajax調用。
如果要使用XML啟動spring應用程序上下文,請使用以下命令:
<bean id="contentNegotiationManager"
class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
<property name="favorParameter" value="true" />
<property name="parameterName" value="mediaType" />
<property name="ignoreAcceptHeader" value="true"/>
<property name="useJaf" value="false"/>
<property name="defaultContentType" value="application/json" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</map>
</property>
</bean>
有關使用Spring 3.2編寫RESTFUL Web服務的更多詳細信息,請參閱我的博客
在將JSON數據傳遞給Spring MVC之前,必須將其轉換為字符串。 那么,這是您案例中的解決方案:
$.ajax({
type:'POST',
url:'/admin/updateDisplay',
data: JSON.stringify({'diagonal':"sss"})
})
你不需要@RequestBody
。
使用@ @RequestBody
Spring調用一個轉換器來獲取整個請求並將其轉換為所需類型的對象。 您將數據作為application/x-www-form-urlencoded
,這是jQuery的默認值,並且沒有內置轉換器。
如果沒有@RequestBody
,當您發送表單數據時,spring會創建一個空對象,並根據您發送的數據設置屬性。 所以在你的情況下,Spring會做類似的事情
display = new Display();
display.setDiagonal("sss");
我想,這就是你想要的。
我不知道這是否也是你的問題,但對我來說,這個value
是錯誤的並導致error 405
,例如:
@RequestMapping(value = "/planilha/{id}", method = RequestMethod.PUT)
public String update(@PathVariable("id") String id, @RequestBody String jsonStr) {
BasicDBObject json = ((BasicDBObject) JSON.parse(jsonStr));
PlanilhaDAO dao = new PlanilhaDAO();
BasicDBObject ola = dao.update(id, json);
return ola.toString();
}
@RequestMapping(value = "/planilha/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") String id) {
PlanilhaDAO dao = new PlanilhaDAO();
BasicDBObject temp = dao.remove(id);
return temp.toString();
}
需要改變:
@RequestMapping(value = "/planilha/{id}/**", method = RequestMethod.PUT)
public String update(@PathVariable("id") String id, @RequestBody String jsonStr) {
BasicDBObject json = ((BasicDBObject) JSON.parse(jsonStr));
PlanilhaDAO dao = new PlanilhaDAO();
BasicDBObject ola = dao.update(id, json);
return ola.toString();
}
@RequestMapping(value = "/planilha/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") String id) {
PlanilhaDAO dao = new PlanilhaDAO();
BasicDBObject temp = dao.remove(id);
return temp.toString();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.