Я работаю с Spring Framework 4.0.7, вместе с MVC и Rest
Я могу работать в мире с:
@Controller
ResponseEntity<T>
Например:
@Controller
@RequestMapping("/person")
@Profile("responseentity")
public class PersonRestResponseEntityController {
С помощью метода (только для создания)
@RequestMapping(value="/", method=RequestMethod.POST)
public ResponseEntity<Void> createPerson(@RequestBody Person person, UriComponentsBuilder ucb){
logger.info("PersonRestResponseEntityController - createPerson");
if(person==null)
logger.error("person is null!!!");
else
logger.info("{}", person.toString());
personMapRepository.savePerson(person);
HttpHeaders headers = new HttpHeaders();
headers.add("1", "uno");
//http://localhost:8080/spring-utility/person/1
headers.setLocation(ucb.path("/person/{id}").buildAndExpand(person.getId()).toUri());
return new ResponseEntity<>(headers, HttpStatus.CREATED);
}
вернуть что-то
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public ResponseEntity<Person> getPerson(@PathVariable Integer id){
logger.info("PersonRestResponseEntityController - getPerson - id: {}", id);
Person person = personMapRepository.findPerson(id);
return new ResponseEntity<>(person, HttpStatus.FOUND);
}
Работает отлично
Я могу сделать то же самое с :
@RestController
(Я знаю это то же самое, что и@Controller
+@ResponseBody
)@ResponseStatus
Например:
@RestController
@RequestMapping("/person")
@Profile("restcontroller")
public class PersonRestController {
С помощью метода (только для создания)
@RequestMapping(value="/", method=RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void createPerson(@RequestBody Person person, HttpServletRequest request, HttpServletResponse response){
logger.info("PersonRestController - createPerson");
if(person==null)
logger.error("person is null!!!");
else
logger.info("{}", person.toString());
personMapRepository.savePerson(person);
response.setHeader("1", "uno");
//http://localhost:8080/spring-utility/person/1
response.setHeader("Location", request.getRequestURL().append(person.getId()).toString());
}
вернуть что-то
@RequestMapping(value="/{id}", method=RequestMethod.GET)
@ResponseStatus(HttpStatus.FOUND)
public Person getPerson(@PathVariable Integer id){
logger.info("PersonRestController - getPerson - id: {}", id);
Person person = personMapRepository.findPerson(id);
return person;
}
Мои вопросы:
- когда по какой- либо веской причине или по конкретному сценарию один из вариантов должен обязательно использоваться над другим
- Если (1) не имеет значения, какой подход предлагается и почему.
источник
ResponseEntity
, он более гибкий. Просто у меня были сомнения@RestController
. СпасибоЧтобы завершить ответ от Sotorios Delmanolis.
Это правда, что
ResponseEntity
дает вам больше гибкости, но в большинстве случаев вам это не понадобится, и в конечном итоге вы будете использовать ихResponseEntity
повсюду в контроллере, что затруднит чтение и понимание.Если вы хотите обрабатывать особые случаи, такие как ошибки (Not Found, Conflict и т. Д.), Вы можете добавить a
HandlerExceptionResolver
в конфигурацию Spring. Таким образом, в вашем коде вы просто выбрасываете конкретное исключение (NotFoundException
например) и решаете, что делать в вашем обработчике (устанавливая статус HTTP на 404), делая код контроллера более понятным.источник
Согласно официальной документации: Создание контроллеров REST с аннотацией @RestController
Кажется, что это лучше использовать
@RestController
для ясности, но вы также можете комбинировать его сResponseEntity
гибкостью, когда это необходимо (в соответствии с официальным руководством и кодом здесь и моим вопросом, чтобы подтвердить это ).Например:
такой же как:
Таким образом, вы можете определить
ResponseEntity
только при необходимости.Обновить
Вы можете использовать это:
источник
@ResponseStatus(HttpStatus.OK)
игнорируется, когда вы вернетесьResponseEntity<>(user, responseHeaders, HttpStatus.NOT_FOUND)
. Ответ HTTP404
Надлежащий REST API должен иметь в ответ следующие компоненты
Основной целью ResponseEntity было предоставление опции 3, остальные варианты могли быть достигнуты без ResponseEntity.
Поэтому, если вы хотите указать местоположение ресурса, лучше использовать ResponseEntity, иначе этого можно избежать.
Рассмотрим пример, где API модифицируется для предоставления всех упомянутых опций
Источник - Весна в действии
источник