Что возвращать, если метод Spring MVC controller не возвращает значение?
Я использую jQuery $.getJSON() для выполнения асинхронных вызовов на мой простой Spring MVC backend. Большинство методов Spring controller выглядят следующим образом:
@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(...) {
...
}
если нет, то каков соответствующий синтаксис для использования здесь? Спасибо заранее!
7 ответов:
вы можете вернуть void, затем вы должны отметить метод с помощью @ResponseStatus (value = HttpStatus.ОК) вам не нужно @ResponseBody
@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST) @ResponseStatus(value = HttpStatus.OK) public void updateDataThatDoesntRequireClientToBeNotified(...) { ... }только get методы возвращают 200 код состояния имплицитности, все остальные у вас есть сделать одну из трех вещей:
- возвратите void и отметьте метод с
@ResponseStatus(value = HttpStatus.OK)- верните объект и отметьте его с
@ResponseBody- возвратить
HttpEntityэкземпляр
вы можете просто вернуть ResponseEntity с соответствующим заголовком:
@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST) public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){ .... return new ResponseEntity(HttpStatus.OK) }
вы можете вернуть объект "ResponseEntity". Использование объекта "ResponseEntity" очень удобно как в момент построения объекта ответа (который содержит тело ответа и код состояния HTTP), так и в момент получения информации из объекта ответа.
такие методы, как getHeaders (), getBody (), getContentType (), getStatusCode() и т. д., делают работу по чтению объекта ResponseEntity очень легкой.
вы должны использовать ResponseEntity объект с http код состояния 204 (без содержимого), который специально указывает, что запрос был обработан правильно, а тело ответа намеренно пусто. Использование соответствующих кодов состояния для передачи правильной информации очень важно, особенно если вы создаете API, который будет использоваться несколькими клиентскими приложениями.
Да, вы можете использовать @ResponseBody с
voidтип возврата:@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST) @ResponseBody public void updateDataThatDoesntRequireClientToBeNotified(...) { ... }
нет ничего плохого в возвращении пустота
@ResponseBodyи выPOSTзапросы.используйте коды состояния HTTP для определения ошибок в подпрограммах обработчика исключений вместо того, чтобы другие упоминают статус успеха. Обычный метод, как у вас будет возвращать код ответа
200что вы хотите, любой обработчик исключений может затем вернуть объект ошибки и другой код (т. е.500).
но как ваша система растет в размерах и функциональности... я думаю, что возвращение всегда json-это совсем не плохая идея. Это больше архитектурное / "крупномасштабное проектирование".
вы можете подумать о повторном использовании всегда JSON с двумя полями know: code и data. Где код-это числовой код, определяющий успешность выполняемой операции, а данные-любые дополнительные данные, связанные с запрошенной операцией / услугой.
Давай, когда мы используем серверную службу поставщика, любая услуга может быть проверена, чтобы увидеть, если он работал хорошо.
поэтому я придерживаюсь, чтобы не позволить spring управлять этим, подвергая гибридные операции возврата (некоторые возвращает данные другие ничего...).. instaed убедитесь, что ваш сервер предоставляет более однородный интерфейс. Это более просто в конце дня.
вот пример кода, что я сделал для асинхронного метода
@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)
Comments