Что возвращать, если метод 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(...) {
...
}


если нет, то каков соответствующий синтаксис для использования здесь? Спасибо заранее!

776   7  

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

    Ничего не найдено.