Что вернуть, если Spring метод MVC-контроллера не возвращает значение?
Я использую jQuery $.getJSON()
для создания асинхронных вызовов в моем простом 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(...) {
...
}
Если нет, то какой синтаксис использовать здесь? Спасибо заранее!
Ответы
Ответ 1
вы можете вернуть 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
Ответ 2
Вы можете просто вернуть ResponseEntity с соответствующим заголовком:
@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){
....
return new ResponseEntity(HttpStatus.OK)
}
Ответ 3
Вы можете вернуть объект ResponseEntity.
Использование объекта "ResponseEntity" очень удобно как при создании объекта ответа (который содержит тело ответа и код состояния HTTP), так и во время получения информации из объекта ответа.
Методы, такие как getHeaders(), getBody(), getContentType(), getStatusCode() и т.д., облегчают работу с объектом ResponseEntity.
Вы должны использовать объект ResponseEntity с кодом статуса http из 204 (без содержимого), который специально указывает, что запрос обработан правильно, а тело ответа намеренно пусто.
Использование соответствующих кодов статуса для передачи правильной информации очень важно, особенно если вы создаете API, который будет использоваться несколькими клиентскими приложениями.
Ответ 4
Да, вы можете использовать @ResponseBody с типом возврата void
:
@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseBody
public void updateDataThatDoesntRequireClientToBeNotified(...) {
...
}
Ответ 5
Нет ничего плохого в возвращении void @ResponseBody
и вы должны запросить POST
.
Используйте коды состояния HTTP, чтобы определять ошибки в процедурах обработчика исключений, а другие упоминают статус успеха. Обычный метод, который у вас есть, вернет код ответа 200
, который вы хотите, любой обработчик исключений может затем вернуть объект ошибки и другой код (т.е. 500
).
Ответ 6
Но поскольку ваша система растет по размеру и функциональности... я думаю, что возвращение всегда json - неплохая идея. Это больше архитектурный/ "масштабный дизайн".
Вы можете думать о том, чтобы всегда сохранять JSON с двумя полями: код и данные. Где код - это числовой код, определяющий успешность выполняемой операции, а данные - любые дополнительные данные, связанные с запрошенной операцией/службой.
Приходите, когда мы используем бэкэнд поставщика услуг, любая служба может быть проверена, чтобы убедиться, что она работает хорошо.
Итак, я придерживаюсь, чтобы не позволить spring управлять этим, выставляя гибридные возвращаемые операции (некоторые возвращают данные, другие ничего...).. instaed убедитесь, что ваш сервер выставляет более однородный интерфейс. Более простой в конце дня.
Ответ 7
Вот пример кода, который я сделал для асинхронного метода
@RequestMapping(value = "/import", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void importDataFromFile(@RequestParam("file") MultipartFile file)
{
accountingSystemHandler.importData(file, assignChargeCodes);
}
Вам не нужно возвращать какие-либо вещи из вашего метода, все, что вам нужно для использования этой аннотации, чтобы ваш метод должен был возвращать ОК в каждом случае
@ResponseStatus(value = HttpStatus.OK)