2014-12-24 3 views
1

Я пытаюсь отправить ответ JSON от контроллера grails для отображения в jQuery datatable (v 1.9), но я получаю нулевой ответ.Невозможно отправить ответ JSON от контроллера grails в jQuery datatable

Вот мой контроллер: -

def breakHierarchy = 
{ 
    logger.info("breakHierarchy begins here"); 
    userObject = session.myBeanU; 
    userLoggedIn = userStatus.checkUserLoggedIn(userObject); 

    ArrayList<HierarchyBreakBean> mappingList; 
    JsonObject jsonResponse; 

    if(userLoggedIn) { 
     def hierarchyBreakInstance = new HierarchyBreak(params);       
     String[] divisionList = params.searsDivNumber; 
     String[] lineList = params.searsLineNumber; 
     String[] sublineList = params.searsSubLineNumber; 
     String[] classList = params.searsClass; 

     try { 
      mappingList = hierarchyBreakService.searchHierarchy(divisionList, lineList, sublineList, classList); 
      jsonResponse = hierarchyBreakService.loadData(request, response, mappingList); 
     } catch(Exception ex){ 
      logger.info("Exception in breakHierarchy: "); 
      ex.printStackTrace(); 
      hierarchyBreakInstance.errors.reject(message(code: ex.toString())); 
      render(view: "hierarchyBreak", model: [hierarchyBreakInstance: hierarchyBreakInstance]); 
      return; 
     } 
    } else { 
     redirect(action: loginError); 
    }  

    return; 
} 

Этот метод LoadData() в службе: -

try { 
     JsonObject jsonResponse = new JsonObject(); 
     jsonResponse.addProperty("sEcho", sEcho); 
     jsonResponse.addProperty("iTotalRecords", iTotalRecords); 
     jsonResponse.addProperty("iTotalDisplayRecords", iTotalDisplayRecords); 

     Iterator<HierarchyBreakBean> it = list.iterator(); 
     while(it.hasNext()){ 
      JsonArray row = new JsonArray(); 
      record = it.next(); 
      row.add(new JsonPrimitive("<input type='checkbox' class='singleSelect' id='item' name='item' value='' />")); 
      row.add(new JsonPrimitive(record.getSearsCategoryNumber())); 
      row.add(new JsonPrimitive(record.getSearsBusNumber())); 
      row.add(new JsonPrimitive(record.getSearsDivNumber())); 
      row.add(new JsonPrimitive(record.getSearsLineNumber())); 
      row.add(new JsonPrimitive(record.getSearsSublineNumber())); 
      row.add(new JsonPrimitive(record.getSearsClassNumber())); 
      row.add(new JsonPrimitive(record.getKmartDivNumber())); 
      row.add(new JsonPrimitive(record.getKmartDeptNumber())); 
      row.add(new JsonPrimitive(record.getKmartCatGroupNumber())); 
      row.add(new JsonPrimitive(record.getKmartCatgNumber())); 
      row.add(new JsonPrimitive(record.getKmartSubCatgNumber())); 
      row.add(new JsonPrimitive(record.getOrderSystem())); 
      row.add(new JsonPrimitive(record.getSearskmartOrderSystemCode())); 
      data.add(row); 
     } 

     jsonResponse.add("aaData", data); 
     response.setContentType("application/Json"); 
     response.getWriter().print(jsonResponse); 
     return jsonResponse; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Это JS я использую: -

var myTable = null; 

$("#searchButton").click(function(){  
    var url = appcontextPath + "/login/breakHierarchy"; 

    $("#row_header").show(); 
    myTable = $("#mappingTable").dataTable({"bServerSide": true, 
              "bProcessing": true, 
              "sAjaxSource": url, 
              "sPaginationType": "full_numbers", 
              "bJQueryUI": true, 
              "bDestroy": true, 
              "aaSorting": [[4,'asc']], 
              "bFilter": false,         
       "aoColumnDefs": [{"sWidth": "20%", "aTargets": [1,2,3,4,5], "sClass": "center"}, 
                  {"bSortable": false, "aTargets": [0]}] 
    }); 
}); 

Данные типа datatable отображаются пустым с помощью панели «Обработка». Может ли кто-нибудь сказать мне, что мне здесь не хватает? Любая помощь приветствуется. Благодаря!

+0

Должны быть ошибки в JS-консоли – injecteer

+0

Я не видел 'render jsonResponse' в вашем контроллере; – dsharew

+0

@ injecteer Моя консоль JS чиста –

ответ

0

ваше действие ничего не делает с созданным объектом JSON. Либо использовать render data или вернуть объект JSON в качестве возвращаемого значения для данного действия:

mappingList = hierarchyBreakService.searchHierarchy(divisionList, lineList, sublineList, classList); 
jsonResponse = hierarchyBreakService.loadData(request, response, mappingList); 
render jsonResponse 

Кроме того, ваш метод сервиса выглядит Java-МОГ. Использование JSON Builder уменьшит сложность на 50%

+0

Жаль, что я новичок в Grails. Я написал тот же код в Java и отправил ответ через контроллер Spring, и он сработал. Однако я не могу отправить ответ с помощью Grails. –

+0

см. Обновление ... – injecteer

+0

Я использовал рендеринг jsonResponse, и он дал мне следующую ошибку JS: - Предупреждение Datatables: данные JSON с сервера не могли быть проанализированы. Это вызвано ошибкой форматирования JSON. Я также использовал рендеринг jsonResponse как JSON, но затем он выбросил ошибку java.lang.UnsupportedOperationException: JsonObject Не могли бы вы помочь мне в этом! –

Смежные вопросы