Estoy trabajando con Spring Framework 4.0.7, junto con MVC y Rest
Puedo trabajar en paz con:
@Controller
ResponseEntity<T>
Por ejemplo:
@Controller
@RequestMapping("/person")
@Profile("responseentity")
public class PersonRestResponseEntityController {
Con el método (solo para crear)
@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);
}
devolver 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 bien
Puedo hacer lo mismo con :
@RestController
(Sé que es lo mismo que@Controller
+@ResponseBody
)@ResponseStatus
Por ejemplo:
@RestController
@RequestMapping("/person")
@Profile("restcontroller")
public class PersonRestController {
Con el método (solo para crear)
@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());
}
devolver 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;
}
Mis preguntas son:
- cuando por una razón sólida o escenario específico, una opción debe usarse obligatoriamente sobre la otra
- Si (1) no importa, qué enfoque se sugiere y por qué.
fuente
ResponseEntity
, es más flexible. Solo estaba con la duda sobre@RestController
. GraciasPara completar la respuesta de Sotorios Delimanolis.
Es cierto que
ResponseEntity
le brinda más flexibilidad, pero en la mayoría de los casos no la necesitará y terminará con estosResponseEntity
en todas partes en su controlador, lo que dificulta su lectura y comprensión.Si desea manejar casos especiales como errores (No encontrado, Conflicto, etc.), puede agregar un
HandlerExceptionResolver
a su configuración de Spring. Entonces, en su código, simplemente lanza una excepción específica (NotFoundException
por ejemplo) y decide qué hacer en su controlador (configurando el estado HTTP en 404), haciendo que el código del controlador sea más claro.fuente
Según la documentación oficial: Creación de controladores REST con la anotación @RestController
Parece que es mejor usarlo
@RestController
para mayor claridad, pero también puede combinarlo conResponseEntity
flexibilidad cuando sea necesario ( según el tutorial oficial y el código aquí y mi pregunta para confirmarlo ).Por ejemplo:
es lo mismo que:
De esta manera, puede definir
ResponseEntity
solo cuando sea necesario.Actualizar
Puedes usar esto:
fuente
@ResponseStatus(HttpStatus.OK)
se ignora cuando regresasResponseEntity<>(user, responseHeaders, HttpStatus.NOT_FOUND)
. La respuesta HTTP es404
Una API REST adecuada debe tener los siguientes componentes en respuesta
El objetivo principal de ResponseEntity era proporcionar la opción 3, las opciones de descanso se podían lograr sin ResponseEntity.
Entonces, si desea proporcionar la ubicación del recurso, usar ResponseEntity sería mejor, de lo contrario, se puede evitar.
Considere un ejemplo en el que se modifica una API para proporcionar todas las opciones mencionadas
Fuente - Primavera en acción
fuente