2015-10-13 35 views
0

更長的標題是:嘗試使用Ajax調用到控制器上插入搜索結果到錯誤的表結果

「試圖使用AJAX調用控制器插入搜索結果到一個表結果而留在同一個頁面的結果爲「405」或「直接自我參照導致循環......」錯誤」


我試圖同時保持找到一種方法來填充搜索結果的表錯誤在同一頁上使用ajax調用控制器。

ajaxCall->控制器 - >服務(完成搜索) - >控制器(來自搜索結果) - >回阿賈克斯與響應

我有被觸發的形式提交防止違約後一個Ajax調用:

function ajaxGetSearchResults(link, form) { 
    var myList=[]; 
    var jqxhr = $.ajax({ 
     "url" : link, 
     "data" : form.serialize(), 
     "dataType" : 'json', 
     "type" : "POST", 
     "headers": { 
      'Content-Type': 'application/json' 
     }, 
     "success" : function (response){ 
      console.log("Ajax success"); 
      fillTable(response);  
      console.log("Search results added to table: "+response); 
     }, 
     "complete": function(response){ 
      console.log("Ajax call to controller completed"); 

     }, 
     "error": function(){ 
      console.log("Ajax call to controller triggered error"); 
     } 
    }); 
} 

在控制器我收到Ajax請求這樣:

@RequestMapping(value = "/ajaxScriptSearch", method = RequestMethod.POST) 
public @ResponseBody List<ResultViewDto> processAJAXRequestSearch(@RequestParam String a1, 
     @RequestParam String a2, @RequestParam String a3, @RequestParam String a4) { 
     SearchDto searchDto = new SearchDto(); 
     searchDto.setAttribute1(a1); 
     searchDto.setAttribute2(a2); 
     searchDto.setAttribute3(a3); 
     searchDto.setAttribute4(a4); 
     try { 
      /* 
      calling Service, performing search using searchDto as a parameter, mapping result to resultViewDtos 

      */ 
     } catch(Exception e){ 
      /* do something */ 
     } 
     return resultViewDtos; 
} 

到服務的調用是全成。 resultViewDtos的一個例子是:[viewDto1,viewDto2,viewDto3]其中每個視圖dto包含一些需要插入到表中的字符串值。

我似乎得到一個「HTTP狀態405 - 請求方法'GET'不支持」的錯誤,但我的ajax調用是「type:POST」。

當我嘗試使用GET insted時,我得到一個「直接自引用導致循環(通過引用鏈...)」的錯誤。

我使用傑克遜核心2.6.2,傑克遜數據綁定2.6.2,彈簧4,休眠4.


我會appericiate任何幫助我能......

+0

添加整個彈簧控制器代碼 –

回答

0

在最後,我設法爲此創建瞭解決方法。

我已經改變了我的Ajax調用這樣:

function ajaxGetSearchResults(link, form) { 
    var jqxhr = $.ajax({ 
     "url" : link, 
     "data" : form, 
     "dataType" : 'json', 
     "headers": { 
      'Accept' : 'application/json', 
      'Content-Type': 'application/json' 
     }, 
     "type" : "GET", 
     "success" : function (response) { 
      console.log("Ajax success"); 
      fillTable(response); 
     }, 
     "complete": function(response) { 
      console.log("Ajax call to controller completed"); 

     }, 
     "error": function() { 
      console.log("Ajax call to controller triggered error"); 
     } 
    }); 
} 

而且我的控制器如下:

@RequestMapping(value = "/ajaxScriptSearch", method = RequestMethod.GET) 
public @ResponseBody List<String> processAJAXRequestSearch(@RequestParam String a1, 
    @RequestParam String a2, @RequestParam String a3, @RequestParam String a4) { 
    SearchDto searchDto = new SearchDto(); 
    searchDto.setAttribute1(a1); 
    searchDto.setAttribute2(a2); 
    searchDto.setAttribute3(a3); 
    searchDto.setAttribute4(a4); 
    List<String> result = new ArrayList<String>(); 
    List<ResultViewDto> resultViewDtos = new ArrayList<ResultViewDto>(); 
     try { 
      /* 
       calling Service, performing search using searchDto as a parameter, mapping result to resultViewDtos 
      */ 
      for(int i=0; i<resultViewDtos.size(); i++){ 
       result.add(resultViewDtos.get(i).toResponseString()); //a new method 
      } 
     } catch(Exception e){ 
      /* do something */ 
     } 
     return result; 
} 

toResponseString()是一種新的方法,我在resultViewDto創建返回一個字符串其中我需要的屬性用「:」分隔。我填充結果並將其發送回ajax作爲響應,然後將接收到的響應首先分割(','),以便將單個「行」等同於單個resultViewDto,然後按(': ')來獲取每個單元格的值。

可能有更好的方法來解決它,但這就像一個魅力。 我希望這對其他人也有用。