Что возвращать, если метод контроллера Spring MVC не возвращает значение?

Я использую $.getJSON() в jQuery для выполнения асинхронных вызовов моего простого бэкэнда Spring MVC. Большинство методов контроллера Spring выглядят так:

@RequestMapping(value = "/someURL", method = RequestMethod.POST)
public @ResponseBody SomePOJO getSomeData(@ModelAttribute Widget widget,
    @RequestParam("type") String type) {
    return someDAO.getSomeData(widget, type);
}   

У меня все настроено так, что каждый контроллер возвращает @ResponseBody в виде JSON, чего и ожидает клиентская сторона.

Но что происходит, когда запрос не должен возвращать какой-либо контент на стороне клиента? Могу ли я иметь:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public @ResponseBody void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

Если нет, какой синтаксис использовать здесь? Заранее спасибо!

108 голосов | спросил IAmYourFaja 11 +04002012-10-11T14:52:34+04:00312012bEurope/MoscowThu, 11 Oct 2012 14:52:34 +0400 2012, 14:52:34

7 ответов


0

вы можете вернуть void, тогда вы должны пометить метод с помощью @ResponseStatus (value = HttpStatus.OK), вам не нужен @ResponseBody

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

Только методы get возвращают простоту кода состояния 200, все остальные, что у вас есть, делают одно из трех:

  • Вернуть void и пометить метод с помощью @ResponseStatus(value = HttpStatus.OK)
  • Верните объект и пометьте его @ResponseBody
  • Возвращает экземпляр HttpEntity
ответил ams 11 +04002012-10-11T16:43:16+04:00312012bEurope/MoscowThu, 11 Oct 2012 16:43:16 +0400 2012, 16:43:16
0

Вы можете просто вернуть ResponseEntity с соответствующим заголовком:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){
....
return new ResponseEntity(HttpStatus.OK)
}
ответил Biju Kunjummen 11 +04002012-10-11T16:42:26+04:00312012bEurope/MoscowThu, 11 Oct 2012 16:42:26 +0400 2012, 16:42:26
0

Вы можете вернуть объект ResponseEntity. Использование объекта ResponseEntity очень удобно как во время создания объекта ответа (который содержит тело ответа и код состояния HTTP), так и во время получения информации из объекта ответа.

Такие методы, как getHeaders (), getBody (), getContentType (), getStatusCode () и т. д., упрощают чтение объекта ResponseEntity.

Вы должны использовать объект ResponseEntity с кодом состояния http 204 (без содержимого), который специально указывает на то, что запрос был обработан правильно, а тело ответа намеренно пусто. Использование соответствующих кодов состояния для передачи нужной информации очень важно, особенно если вы создаете API, который будет использоваться несколькими клиентскими приложениями.

ответил Harley 13 PM00000090000000131 2015, 21:41:01
0

Да, вы можете использовать @ResponseBody с void тип возврата:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseBody
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}
ответил user1338062 19 Mayam15 2015, 08:53:14
0

Нет ничего плохого в возврате void @ResponseBody, и вы должны для POST запросы.

Используйте коды состояния HTTP для определения ошибок в подпрограммах обработчика исключений, так как другие упоминают об успехе. Обычный метод, который у вас есть, вернет код ответа 200, который вам нужен, любой обработчик исключений может затем вернуть объект ошибки другой код (т. е. 500).

ответил Brett Ryan 19 ThuEurope/Moscow2013-12-19T08:35:11+04:00Europe/Moscow12bEurope/MoscowThu, 19 Dec 2013 08:35:11 +0400 2013, 08:35:11
0

Но поскольку ваша система растет в размерах и функциональности ... я думаю, что возвращать всегда json - это совсем не плохая идея. Это скорее архитектурный /«масштабный дизайн».

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

Да ладно, когда мы используем серверную часть поставщика услуг, можно проверить любую службу, чтобы проверить, хорошо ли она работает.

Так что я придерживаюсь, чтобы не позволить Spring справиться с этим, разоблачая гибридные операции возврата (некоторые возвращают данные, другие ничего не делают ...) .. Убедитесь, что ваш сервер предоставляет более однородный интерфейс. Проще в конце дня.

ответил Victor 12 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 12 Sep 2013 19:36:19 +0400 2013, 19:36:19
0

Вот пример кода, который я сделал для асинхронного метода

@RequestMapping(value = "/import", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void importDataFromFile(@RequestParam("file") MultipartFile file) 
{
    accountingSystemHandler.importData(file, assignChargeCodes);
}

Вам не нужно возвращать что-либо из вашего метода, все что вам нужно, чтобы использовать эту аннотацию, чтобы ваш метод возвращал OK в каждом случае

@ResponseStatus(value = HttpStatus.OK)
ответил AbdusSalam 4 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 04 Sep 2017 05:58:44 +0300 2017, 05:58:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132