2013-11-13 2 views
-1

У меня есть уже работающий JavaScript AJAX POST, как это: боковойВозможно ли передать несколько параметров для javascript JSON AJAX POST в Spring MVC-контроллер?

Клиент:

<script language="JavaScript" type="text/javascript"> 
    var column = "test1"; 
    var filterType = 1; 
    var values = []; 
    var filter = { "column" : column, "filterType" : filterType, "values": values}; 
    var filter2 = { "column" : column, "filterType" : filterType, "values": values}; 
    filter2.column = "test2"; 
    var filters = new Array(); 
    filters[0] = filter; 
    filters[1] = filter2; 

    $.ajax({ 
     url: "${pageContext.request.contextPath}/api/user_administration/get", 
     data: JSON.stringify(filters), 
     type: "POST", 
     beforeSend: function(xhr) 
     { 
      xhr.setRequestHeader("Accept", "application/json"); 
      xhr.setRequestHeader("Content-Type", "application/json"); 
     }, 
     success: function(user) 
     { 

     } 
    }); 
</script> 

стороне сервера:

@RequestMapping(value = "user_administration/get", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public List<User> get(@RequestBody ColumnFilter[] filters) 
{ 
    //do something 
    return userService.getAll(); 
} 

Теперь я хочу передать два или более параметров. Что-то вроде этого:

@RequestMapping(value = "user_administration/get", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public List<User> get(@RequestBody ColumnFilter[] filters, @RequestBody ColumnSorter[] sorters) 
{ 
    //do something 
    return userService.getAll(); 
} 

Можно ли это достичь? Как?

(я уже знаю, что я могу просто инкапсулировать их в другой объект/класс/объекта)

+0

Я думаю, вы можете инкапсулировать его, как вы сказали, или добавить другие параметры для запроса заголовка, а затем вы можете получить к ним доступ по имени параметра , –

+0

@ jakub.petr рассказать мне больше о «других параметрах для запроса заголовка» – William

+0

JS: http://stackoverflow.com/questions/3258645/pass-request-headers-in-a-jquery-ajax-get-call Spring : http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch16s11.html Лично я считаю, что лучше инкапсулировать его на другой объект и передать в requestBody –

ответ

0

В вашем AJAX звонить у вас есть линия

data: JSON.stringify(filters), 

Изменение или продлить эту линию, чтобы добавить дополнительные параметров для запроса. И если вы не ясно, что происходит, или необходимо войти/диагностики/отладки это, вы всегда можете использовать промежуточную переменную ..

Вы можете либо передать data как объект ключ-значение Javascript (предоставление имени параметры), String или - как это делает существующий код - JSON, кодирующий объект.

Поскольку вы, кажется, хотите передать больше полей/параметров & уже используют кодировку JSON, вероятно, имеет смысл сделать их более крупными «полезными» объектами до кодирования JSON.

var paramData = {filter:filters, sorters: mySortersOrWhatever}; 
console.log('some administration AJAX request', paramData); 
$.ajax({ 
    ... 
    data: JSON.stringify(paramData) 

Посмотрите, как это сопрягается с запросом-анализа в Spring - для декодирования двух отдельных параметров на стороне Spring вам нужно будет либо имена (не только запроса тела), расшифровать их из названных параметров, либо (простейший) просто принять один большой объект JSON в качестве параметра.

Это должно быть разумно прямолинейным - как всегда, следовать основным принципам разработки программного обеспечения (регистрировать его, диагностировать, исправить, пока он не будет работать), чтобы вы могли создать необходимую рабочую функциональность.

+0

Я уже упоминал, что я уже знал, что могу просто инкапсулировать их. Прочтите нижнюю часть описания. – William

+0

Ну, все примеры JSON, которые я могу найти, требуют '@ RequestBody' и совершенно ясно об этом. Но вы можете попробовать '@RequestParam (« фильтры »)' и '@RequestParam (« сортировщики »)' .. см. Этот пост, который рассказывает о пользовательском коде, чтобы он мог работать. http://stackoverflow.com/questions/8946098/spring-mvc-deserialize-single-json. Дайте нам знать, как вы идете .. и мне жаль, что вы попадались как недоказанные. –

+0

Спасибо за ссылку. Я просто заявил, что упоминал об этом в своем описании. Я не оскорблял вас и не говорил, что вы ошибаетесь, и я не обязан одобрять каждый ответ, который меня бросает. Не нужно принимать его лично. Я не знаю, кто изменил мой вопрос, но если бы это был вы, неразумно ниспровергать действительный вопрос о том, что я говорю вам, потому что это не имеет никакого отношения к самому вопросу. Ad Hominem. – William

0

Spring документация говорит:

@RequestBody параметр метода аннотацию указывает, что параметр метода должен быть связан с величиной тела запроса HTTP.

Это предполагает, что тело запроса HTTP не делится. Следовательно, все, что вам нужно сделать, это следовать обходному решению. Здесь вы можете увидеть точно такой же вопрос. Spring REST multiple @RequestBody parameters, possible?

+0

Я уже упоминал, что уже знал, что могу просто их инкапсулировать. Прочтите нижнюю часть описания. – William

+0

Я красный этот. Но ответ на ваш вопрос на 90% нет. Вы не можете делать то, что хотите. – mvb13

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