@RestController с ResponseEntity - PullRequest
       19

@RestController с ResponseEntity

0 голосов
/ 08 апреля 2020

Я знаю, что @RestController на самом деле @Controller плюс @ResponseBody. Но если я изменю свой метод на возврат ResponseEntity, как показано ниже, использование @RestController не имеет особой задачи для выполнения здесь.

@GetMapping(value="/my-url")
    public ResponseEntity<?> getSomething( @RequestParam(value = "id") String id){
     //code here
}

Значит ли это, что @RestController и @Controller выполняют ту же задачу если тип возвращаемого значения ResponseEntity.

Если это так, то я вижу много примеров, все еще использующих @RestController вместе с ResponseEntity вместо простого @Controller. Я что-то здесь упускаю.

1 Ответ

1 голос
/ 08 апреля 2020

Нет смысла аннотировать ваш класс контроллера с помощью @RestController (вместо @Controller), если он имеет только методы-обработчики, которые возвращают ResponseEntity.

Spring MVC. Инфраструктура по умолчанию регистрирует список HandlerMethodReturnValueHandler реализации для каждого отдельного поддерживаемого типа возвращаемого значения. Например, есть ModelAndViewMethodReturnValueHandler для методов-обработчиков, возвращающих ModelAndView объекты; DeferredResultMethodReturnValueHandler для методов, возвращающих DeferredResult или ListenableFuture; ViewNameMethodReturnValueHandler для методов, возвращающих значения String, которые должны интерпретироваться как имена представлений.

Список обрабатывается по порядку, и используется первый найденный обработчик, который может поддерживать возвращаемое значение. Обработка реализации ResponseEntity, HttpEntityMethodProcessor, регистрируется до одной обработки @ResponseBody, RequestResponseBodyMethodProcessor. @RestController, в некотором смысле, игнорируется для соответствующего метода-обработчика, возвращающего ResponseEntity.

Если у вашего класса контроллера есть другие методы-обработчики, которые возвращают значения, которые предназначены для прямой сериализации, то он не ' Больно хранить @RestController (вместо того, чтобы пометить все эти методы с помощью @ResponseBody). Но если все ваши методы возвращают ResponseEntity, то это не нужно и может вводить в заблуждение.

К вашему сведению, список обработчиков по умолчанию генерируется в закрытом методе с именем getDefaultReturnValueHandlers() в RequestMappingHandlerAdapter. Вы можете предоставить свой список, позвонив по номеру setReturnValueHandlers.

...