Подтвердить что ты не робот

Как отвечать кодом статуса 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;
        }
    }
}
4b9b3361

Ответ 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();
}