Solución:
ResponseEntity
está destinado a representar la respuesta HTTP completa. Puede controlar todo lo que incluye: código de estado, encabezados y cuerpo.
@ResponseBody
es un marcador para el cuerpo de la respuesta HTTP y @ResponseStatus
declara el código de estado de la respuesta HTTP.
@ResponseStatus
no es muy flexible. Marca todo el método, por lo que debe asegurarse de que su método controlador siempre se comporte de la misma manera. Y todavía no puedes configurar los encabezados. Necesitarías el HttpServletResponse
o un HttpHeaders
parámetro.
Básicamente, ResponseEntity
te permite hacer más.
Para completar la respuesta de Sotorios Delimanolis.
Eso es verdad ResponseEntity
le brinda más flexibilidad, pero en la mayoría de los casos no lo necesitará y terminará con estos ResponseEntity
en todas partes de su controlador, lo que dificulta la lectura y la 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 decida qué hacer en su controlador (estableciendo el estado HTTP en 404), haciendo que el código del controlador sea más claro.
Según la documentación oficial: Creación de controladores REST con la anotación @RestController
@RestController es una anotación de estereotipo que combina @ResponseBody y @Controller. Más que eso, le da más significado a su controlador y también puede incluir semántica adicional en futuras versiones del marco.
Parece que es mejor usar @RestController
para mayor claridad, pero también puedes combinar esto con ResponseEntity
para flexibilidad cuando sea necesario (de acuerdo con el tutorial oficial y el código aquí y mi pregunta para confirmarlo).
Por ejemplo:
@RestController
public class MyController {
@GetMapping(path = "/test")
@ResponseStatus(HttpStatus.OK)
public User test() {
User user = new User();
user.setName("Name 1");
return user;
}
}
es lo mismo que:
@RestController
public class MyController {
@GetMapping(path = "/test")
public ResponseEntity<User> test() {
User user = new User();
user.setName("Name 1");
HttpHeaders responseHeaders = new HttpHeaders();
// ...
return new ResponseEntity<>(user, responseHeaders, HttpStatus.OK);
}
}
De esta manera, puede definir ResponseEntity
solo cuando sea necesario.
Actualizar
Puedes usar esto:
return ResponseEntity.ok().headers(responseHeaders).body(user);