2016-11-24 30 views
0

私はSpring MVC上で簡単なJavaアプリケーションを持っており、Springのコントローラにajaxリクエストを送信します。私は、ヘッダーは、 "同意する" "アプリケーション/ JSON""のContent-Type"、 "アプリケーション/ jsonの;のcharset = UTF-8" に設定するとAJAX呼び出しで私はときエラーdubuggerで400を取得します私はそれを削除するエラー415を取得します。Spring MVC + Ajaxエラー400

私は公共の文字列logoutPage(@RequestBody文字列obyavleniye)に、コントローラのメソッドのシグネチャを変更した場合、私はJSON文字列を取得します。コントローラーの解析要求にはどのような問題がありますか?

JS方法:

$("#advertForm").submit(function(e) { 
     e.preventDefault(); 
     var token = $("meta[name='_csrf']").attr("content"); 
     var header = $("meta[name='_csrf_header']").attr("content"); 
     var obyavleniye = { 
      title: "Title", 
      price: "80", 
      description: "desc", 
      date: "2016-11-07 18:30:21", 
      authorid: "2", 
      category: "A", 
      state: "new", 
      img1: "http", 
      img2: "http", 
      img3: "http", 
      img4: "http", 
     }; 
     var post_data = JSON.stringify(obyavleniye); 

     console.log(post_data); 
     $.ajax({ 
      url : "/upload", 
      type: "POST", 
      dataType: 'json', 
      data: post_data, 
      beforeSend: function(xhr) { 
       xhr.setRequestHeader("Accept", "application/json"); 
       xhr.setRequestHeader("Content-Type", "application/json;charset=utf-8"); 
       xhr.setRequestHeader(header, token); 
      }, 
      complete: function() { 
       console.log("Sent"); 
      }, 
      success: function (response) { 
       console.log("success"); 
       console.log("response" + response); 
      }, 
      error: function (data) { 
       console.log("error"); 
       console.log(data); 
      } 
     }); 
    }); 

コントローラ方法:

@ResponseBody 
    @RequestMapping(value="/upload", method = RequestMethod.POST) 
    public String logoutPage (@RequestBody Advert obyavleniye) { 
// public String logoutPage (@RequestBody String obyavleniye) { 
     System.out.println("Enter: " + obyavleniye); 
     this.advertService.addAdvert(obyavleniye); 
//  return "{\"msg\":\"success\"}"; 
     return "{\"title\":\"Title\",\"price\":\"80\",\"description\":\"normm\",\"date\":\"2016-11-07 18:30:21\",\"authorid\":\"2\",\"category\":\"A\",\"state\":\"new\",\"img1\":\"http\",\"img2\":\"http\",\"img3\":\"http\",\"img4\":\"http\"}"; 
    } 
+0

広告クラスのプロパティを指定してください。 –

答えて

1

私のサンプルコード。

JS

Company.prototype.saveCompanyLocation = function() { 
     /* company */ 
     var companyIdx = $('#companyIdx').val(); 
     var locationIdx = $('#locationIdx').val(); 

     var data = { 
      idx : locationIdx, 

      postCode : $('#postCode').val(), 
      address : $('#address').val(), 
      detailAddress : $('#detailAddress').val(), 

      tel : $('#tel').val(), 
      fax : $('#fax').val(), 
      email : $('#email').val(), 
      language : $("#language").val(), 

      latitude : $('#latitude').val(), 
      longtitude : $('#longtitude').val() 

     }; 

     data = JSON.stringify(data); 

     $.ajax({ 
      url : "/gpim/company/settings/location/save/" + companyIdx, 
      type : 'POST', 
      data : data, 
      contentType : 'application/json', 

      success : function(response) { 
       if (response == "success") { 
        document.location.reload(true); 
       } else { 
        $("#editMsg").text("you can`t save location information."); 
       } 
      }, 
      error : function(request, status, error) { 

      } 
     }); 
    }; 

コントローラ

@RequestMapping(value = "/settings/location/save/{companyIdx}", method = RequestMethod.POST) 
    public @ResponseBody String saveLocation(@PathVariable int companyIdx, @RequestBody CompanyLocation location) { 
     Company company = companyService.findCompanyByIdx(companyIdx); 

     company = companyService.saveCompanyLocation(company, location); 

     if (company != null) { 
      return "success"; 
     } 

     return "fail"; 
    } 
+0

そして違いはどこですか?なぜ私はエラーが発生するのか理解できません。 – Dmitry

+1

"Accept"、 "application/json"でHTTPヘッダーを使用しています。あなたのコントローラはtake(produce = "application/json")か "contentType"、 "application/json"を使います。あなたのコントローラはtake(consumes = "application/json")します。あなたは2つのケースを使用します。 – Byeon0gam

+1

jsでdataType: 'json'を使用します。あなたのコントローラはresponseTypeを返します。 dataType: 'text'とvar data = eval( '(' + response + ')')を使用します。または 'json'を使用する場合。 dataType: 'json'とサーバーコードを検索することができます。それは長いコメントです。 – Byeon0gam

1

以下の手順を実行します。

1)あなたのクラスパスにジャクソンのjarファイルを維持しようとし

2)これはあなたのDTOや広告のクラスのプロパティを確認してください)あなたはAJAX要求すなわち、

dataType : "json" 

またはあなたが

@RequestMapping(value = "/upload", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) 

以下

3としてアプリケーション/ JSONレスポンスを生成する必要が送信中のデータ型を削除していeighterタイプは着信要求と一致する必要があります。すなわち、要求パラメータはDTOメンバーと名前およびタイプの両方と一致しなければならない。

これは、あなたのケースを避けるための方法です。

関連する問題