Как отвечать кодом статуса HTTP в классе Spring MVC @RestController @ResponseBody, возвращающем объект?
Я пытаюсь иметь @RestController
, который принимает @PathVariable
возвращает определенный объект в формате JSON вместе с соответствующим кодом состояния. Пока код будет, он вернет объект в формате JSON, потому что он использует Spring 4 встроенную библиотеку Джексона по умолчанию.
Однако я не знаю, как это сделать, чтобы он дал сообщение пользователю, говорящему, что нам нужна переменная api, затем данные JSON, затем код ошибки (или код успеха, зависящий, если все прошло хорошо). Пример вывода:
Введите значение api как параметр (это также может быть в JSON, если необходимо)
{ "id": 2, "api": "3000105000"...} (это будет объект ответа JSON)
Код состояния 400 (или соответствующий код состояния)
URL с параметром выглядит следующим образом
http://localhost:8080/gotech/api/v1/api/3000105000
Код, который у меня есть до сих пор:
@RestController
@RequestMapping(value = "/api/v1")
public class ClientFetchWellDataController {
@Autowired
private OngardWellService ongardWellService;
@RequestMapping(value = "/wells/{apiValue}", method = RequestMethod.GET)
@ResponseBody
public OngardWell fetchWellData(@PathVariable String apiValue){
try{
OngardWell ongardWell = new OngardWell();
ongardWell = ongardWellService.fetchOneByApi(apiValue);
return ongardWell;
}catch(Exception ex){
String errorMessage;
errorMessage = ex + " <== error";
return null;
}
}
}
Ответы
Ответ 1
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
.
Ответ 2
Идиоматическим способом было бы использовать обработчик исключений вместо того, чтобы перехватывать исключение в вашем обычном методе обработки запросов. Тип исключения определяет код ответа. (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();
}