Что вернуть, если 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)