簡體   English   中英

Spring MVC @RequestBody JSON

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM