2014-08-27 3 views
0

Я пытаюсь отправить сложный объект в контроллер ajax для поисковой системы Spring mvc с тремя переменными: текущей страницей, элементами на странице и параметрами поиска. Проблема заключается в том, что с объявлением метода контроллера не меняет переменную params как карту.Отправить комплексный объект json для контроллера Spring MVC

Как я могу отправить структуру для сбора на контроллере 3 переменных отдельно?

Ошибка:

Required Map parameter 'params' is not present

var dataToSend = { 
     'page': 1, 
     'itemsPerPage': 10, 
     'params': { 
      'codItem': "10", 
      'nameItem': "foo" 
     } 
     }; 

     $.ajax({ 
     url: form.attr("action"), 
     type: 'POST', 
     data: JSON.stringify(dataToSend), 
     dataType: 'json', 
     cache: false 
     }).success(function(data) { 
     callback(data); 
     });   




public @ResponseBody HashMap<String, Object> search(@RequestParam(value="params") Map<String, String> params, @RequestParam(value = "page") int page, @RequestParam(value = "itemsPerPage") int itemsPerPage){ 
}; 

ответ

1
/* An Alternative Solution: See if this helps::::Sample Code of java,javascript,jsp for search parameters. Search Parameter POJO will have search parameters + Pagenumber + RecordCounton the page + sortColumn in it */ 

    public class SearchParameters implements Serializable{ 
     /** 
     * 
     */ 
     private static final long serialVersionUID = 4847934022647742263L; 
     private Integer pageNumber; 
     private String sortColumn; 
     private Integer recordCount; 
     private String sortOrder; 
     private Long gdsProductId; // some search parameter 
     private Integer ruleId; // some search parameter 

    //getter and setters 

    } 
/* your java controller method, which accepts the SearchParameter Object */ 

@RequestMapping(value = "/search", method = RequestMethod.POST) 
@ResponseBody 
public Map<String, GDS> search(SearchParameters parameters) 
     throws Exception { 
    // Print Parameter 
    logger.info("read :=" + parameters); 
    // your logic to be written here 
} 

/* Your Javascript will have the below function. 
    $("#searchPaginationform").serialize() will send the data for all the hidden elements of searchPaginationform in the below jsp. 
    form searchPaginationform will have hidden fields for the pagenumer,rows and other  elements */ 

    $.post('search.form', $("#searchPaginationform").serialize(), function (response) { 

    } 
/* Your Jsp -- see the hiddenfield name is matching the SearchParameter instance variable -*/ 

    <form:form id="searchPaginationform"> 
     <input type="hidden" name="gdsProductId" id="gdsProductId" > 
     <input type="hidden" name="pageNumber" id="pageNumber" value=1> 
     <input type="hidden" name="sortColumn" id="sortColumn" value="metamap_id"> 
     <input type="hidden" name="recordCount" id="recordCount" value=10> 
     <input type="hidden" name="sortOrder" id="sortOrder" value="desc"> 
     <input type="hidden" name="ruleId" id="ruleId"> 
    </form:form> 
+0

Моя проблема, я хочу, чтобы отправить переменные itemsPerPage страницы и отдельные Params для последующего процесса поиска, который уже поставил меня с ними следующим образом: $ .ajax ({ URL: form.attr («действие»), тип: 'POST', данные: form.serialize() + "& стр =" + 1 + "& itemsPerPage =" + 10, Datatype: 'JSON', кэша:. ложно }) успех (функция (данные) { обратный вызов (данные); }); Но поскольку у меня есть страница и внутри params itemsPerPage Variable – oscar

+0

Вы можете использовать инструменты IE9, dev (F12) и захватить запрос (щелкнув вкладку Nework и нажав кнопку «Начать захват». Входы, такие как HTTP-запрос, не имеют параметр с именем «Params» в вашем случае. – Raghu

+0

Может быть, ваш вызов ajax может быть передан params в теле запроса. Попробуйте @RequestBody в вашем контроллере. – Raghu

2

Чтобы сделать это правильно, вы должны использовать библиотеку JSON. Весна в комплекте с Джексоном.

Сначала вам нужно создать класс для представления своего JSON.

public class MyJson { 
    int page; 
    int itemsPerPage; 
    Map<String, String> params; 

    public MyJson() {} 

    ... getters/setters 

} 

Вы должны изменить $ .ajax, передавать данные как этот {данные: JSON.stringify (dataToSend)}, becouse необходимости параметра, имя.

В вашем методе контроллера написать это:

ObjectMapper mapper = new ObjectMapper(); 

// readValue(youStringJson, destinactionClass) 
MyJson json = mapper.readValue(data, MyJson.class); 

Если у вас есть поглотитель для MyJson Params поля вы можете перебрать json.getParams) карты (.

+0

вам не нужна оболочка .. вы можете просто сказать Map json = mapper.readValue (YOURMAP, Map.class); – george

0

Вы можете просто вводить HttpServletRequest в ваш метод контроллера и читать тело самостоятельно, как показано ниже:

public @ResponseBody HashMap<String, Object> search(HttpServletRequest request) 
{ 

    String params; 
    try 
    { 
     params = IOUtils.toString(request.getInputStream()); 
     System.out.println(params); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

    //Your return statement. 
} 

Выход: {"page":1,"itemsPerPage":10,"params":{"codItem":"10","nameItem":"foo"}}

Вы можете прочитать атрибуты, преобразуя эту строку в JSON объект с помощью используя JSON API sunch как GSON. Или создайте POJO, которые содержат все ваши атрибуты, определите в JSON и преобразуйте ваш Json strig непосредственно в объект POJO.

Пример кода:

MyClass obj = new Gson().fromJson(params, MyClass.class); 

Пусть это поможет вам.

0

Я решил эту проблему следующим образом:

public class SearchRequestDto { 

    private String page; 

    private String itemsPerPage; 

    private MultiValueMap<String, List<String>> params; 

    } 

@ResponseBody 
public HashMap<String, Object> buscador(SearchRequestDto searchRequest) 
{ 
} 

Проблема заключается в том, что она работает в структуре, например, если я пытаюсь подобрать параметры формы, присылает мне не как JSON:

$.ajax({ 
    url: form.attr("action"), 
    type: 'POST', 
    data: { 
     'params': form.serialize(), 
     'page': start, 
     'itemsPerPage': end 
    }, 
    dataType: 'json', 
    cache: false 
    }).success(function(data) { 
    callback(data); 
    }); 

Результат:

itemsPerPage 5 
page 1 
params codItem=asdfasdf&namItem=asdfasdfasdf&tipItem=1000600&tipItem=1000492&public=on&private=on&provinceItem=15&munItem=262&munItem=270&munItem=276&capItem=123123 

И serializeArray():

itemsPerPage 5 страница 1

params [10] [name] munItem 
params [10] [value] 270 
params [11] [name] munItem 
params [11] [value] 276 
params [13] [name] capItem 
params [13] [value] 123123 
params [2] [name] codItem 
params [2] [value] asdfasdf 
params [3] [name] nameItem 
params [3] [value] asdfasdfasdf 
params [4] [name] tipItem 
params [4] [value] 1000600 
params [5] [name] tipItem 
params [5] [value] 1000492 
params [6] [name] public 
params [6] [value] on 
params [7] [name] private 
params [7] [value] on 
params [8] [name] provinceItem 
params [8] [value] 15 
params [9] [name] munItem 
params [9] [value] 262 

Как я могу отправить его как в структуре dataToSend? единственный способ - пройти через параметры?

0

Моя окружающая среда: AngularJs, SpringMVC, Gson JSONObject

Обычно, если я посылаю сложный объект JSON с конца шрифта для резервного конца, я буду делать общий способ, как показано ниже, чтобы справиться с этим.

первый:

$http({ 
    method: 'POST', 
    url: contextPath+"/voice/submitWrapupForm", 
    dataType: 'json', 
    data: $.param({ 
       content : angular.toJson({ array:$(form).serializeArray() }) 
      }), 
    headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } 
).success(function (data, status) { 
    console.log(data); 
}); 

я использую angularJs представить отформатированную строку JSON, я считаю, с помощью JQuery Ajax будет то же самое, просто нужно быть уверенным, что данные у послали JSON отформатированную строку. https://docs.angularjs.org/api/ng/function/angular.toJson

второй:

@RequestMapping(value = "/submitForm", method = RequestMethod.POST,headers = "Accept=application/json") 
public @ResponseBody String submitForm(String content) { 
    JsonObject j = new Gson().fromJson(content ,JsonElement.class).getAsJsonObject(); 
    return j.toString(); 
} 

и может следить за содержанием JSon является перейти к MVC контроллер, а в контроллере и можно использовать Gson для преобразования и JSON объект.