Estou trabalhando com o Spring Framework 4.0.7, junto com o MVC e o Rest
Eu posso trabalhar em paz com:
@Controller
ResponseEntity<T>
Por exemplo:
@Controller
@RequestMapping("/person")
@Profile("responseentity")
public class PersonRestResponseEntityController {
Com o método (apenas para criar)
@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);
}
para retornar algo
@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);
}
Funciona bem
Eu posso fazer o mesmo com :
@RestController
(Eu sei que é o mesmo que@Controller
+@ResponseBody
)@ResponseStatus
Por exemplo:
@RestController
@RequestMapping("/person")
@Profile("restcontroller")
public class PersonRestController {
Com o método (apenas para criar)
@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());
}
para retornar algo
@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;
}
Minhas perguntas são:
- quando, por um motivo sólido ou cenário específico, uma opção deve ser usada obrigatoriamente sobre a outra
- Se (1) não importa, qual abordagem é sugerida e por quê.
fonte
ResponseEntity
, é mais flexível. Só estava com a dúvida@RestController
. ObrigadoPara completar a resposta de Sotorios Delimanolis.
É verdade que
ResponseEntity
lhe dá mais flexibilidade, mas na maioria dos casos você não precisará dela e acabará com elasResponseEntity
em todos os lugares do seu controlador, dificultando a leitura e a compreensão.Se você quiser lidar com casos especiais, como erros (não encontrado, conflito, etc.), poderá adicionar um
HandlerExceptionResolver
a sua configuração do Spring. Portanto, em seu código, basta lançar uma exceção específica (NotFoundException
por exemplo) e decidir o que fazer em seu manipulador (configurando o status HTTP para 404), tornando o código do controlador mais claro.fonte
De acordo com a documentação oficial: Criando controladores REST com a anotação @RestController
Parece que é melhor usar
@RestController
para maior clareza, mas você também pode combiná- lo comResponseEntity
flexibilidade quando necessário (de acordo com o tutorial oficial e o código aqui e minha pergunta para confirmar isso ).Por exemplo:
é o mesmo que:
Dessa forma, você pode definir
ResponseEntity
apenas quando necessário.Atualizar
Você pode usar isto:
fonte
@ResponseStatus(HttpStatus.OK)
é ignorado quando você retornaResponseEntity<>(user, responseHeaders, HttpStatus.NOT_FOUND)
. A resposta HTTP é404
Uma API REST adequada deve ter componentes abaixo em resposta
O principal objetivo do ResponseEntity era fornecer a opção 3, opções de descanso poderiam ser alcançadas sem o ResponseEntity.
Portanto, se você deseja fornecer a localização do recurso, usar o ResponseEntity seria melhor, caso contrário, isso pode ser evitado.
Considere um exemplo em que uma API é modificada para fornecer todas as opções mencionadas
Fonte - Primavera em Ação
fonte