Как ответить кодом состояния HTTP в классе Spring MVC @RestController @ResponseBody, возвращающем объект?

Способ POSIX

Если вы заботитесь о переносимости, используйте пример из стандарта POSIX :

i=2
end=5
while [ $i -le $end ]; do
    echo $i
    i=$(($i+1))
done

Выход:

2
3
4
5

Вещи, которые не POSIX:

29
задан Yu Hao 20 October 2017 в 03:48
поделиться

2 ответа

A @RestController не подходит для этого. Если вам нужно вернуть разные типы ответов, используйте ResponseEntity<?>, где вы можете явно установить код состояния.

body из ResponseEntity будут обрабатываться так же, как и возвращаемое значение любого @ResponseBody аннотированного метода.

@RequestMapping(value = "/wells/{apiValue}", method = RequestMethod.GET)
public ResponseEntity<?> fetchWellData(@PathVariable String apiValue){
    try{
        OngardWell ongardWell = new OngardWell();
        ongardWell = ongardWellService.fetchOneByApi(apiValue);

        return new ResponseEntity<>(ongardWell, HttpStatus.OK);
    }catch(Exception ex){
        String errorMessage;
        errorMessage = ex + " <== error";
        return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
    }
}

Обратите внимание, что вам не нужно @ResponseBody для метода @RequestMapping внутри @RestController аннотированного класса.

61
ответ дан Sotirios Delimanolis 20 October 2017 в 03:48
поделиться

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

@ExceptionHandler(MyApplicationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleAppException(MyApplicationException ex) {
  return ex.getMessage();
}

@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String handleAppException(Exception ex) {
  return ex.getMessage();
}
30
ответ дан Affe 20 October 2017 в 03:48
поделиться
Другие вопросы по тегам:

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