He estado viendo varios ejemplos de cómo usar Spring con REST . Nuestro objetivo final es una HATEOAS/HAL
configuración de primavera
He visto dos métodos distintos para renderizar REST dentro de Spring
Vía
@RestController
dentro de un controladorVía
@RepositoryRestResource
dentro de un repositorio
Lo que estoy luchando por encontrar es por qué usarías uno sobre el otro. ¿Al intentar implementar HAL
cuál es mejor?
El backend de nuestra base de datos es Neo4j .
Hay una tercera (y cuarta) opción que no ha descrito, que es usar @BasePathAwareController o @RepositoryRestController, dependiendo de si está realizando acciones específicas de la entidad o no.
@RepositoryRestResource se utiliza para establecer opciones en la interfaz del repositorio público; automáticamente creará puntos finales según corresponda en función del tipo de repositorio que se está ampliando (es decir, CrudRepository / PagingAndSortingRepository / etc.).
@BasePathAwareController y @RepositoryRestController se usan cuando desea crear puntos finales manualmente, pero desea usar las configuraciones REST de Spring Data que ha configurado.
Si usa @RestController, creará un conjunto paralelo de puntos finales con diferentes opciones de configuración, es decir, un convertidor de mensajes diferente, diferentes controladores de errores, etc., pero coexistirán felizmente (y probablemente causarán confusión).
Puede encontrar documentación específica aquí .
fuente
@RestController
usa la misma ruta que a@RepositoryRestResource
, no se crearán los puntos finales del repositorio.Bueno, las respuestas anteriores son correctas en su contexto, aún así te estoy dando un ejemplo práctico.
En muchos escenarios, como parte de la API, necesitamos proporcionar puntos finales para buscar una entidad según ciertos criterios. Ahora, con JPA, ni siquiera tiene que escribir consultas, solo cree una interfaz y métodos con nomenclatura específica de Spring-JPA. Para exponer tales API, creará una capa de servicio que simplemente llamaría a estos métodos de repositorio y finalmente controladores que expondrán los puntos finales llamando a la capa de servicio.
Lo que Spring hizo aquí, le permitió exponer estos puntos finales desde tales interfaces (repositorios) que generalmente son llamadas GET a la entidad de búsqueda y en segundo plano genera los archivos necesarios para crear puntos finales finales. Entonces, si está utilizando @RepositoryRestResource, no es necesario crear una capa de Servicio / Controlador.
Por otro lado, @RestController es un controlador que se ocupa específicamente de los datos json y el resto del trabajo como controlador. En resumen @Controller + @ResponseBody = @RestController.
Espero que esto ayude.
Vea mi ejemplo de trabajo y blog para lo mismo:
http://sv-technical.blogspot.com/2015/11/spring-boot-and-repositoryrestresource.html
https://github.com/svermaji/Spring-boot-with -hibernate-sin-controlador
fuente
@RepositoryRestController
anular los controladores REST Spring Data generados por defecto del repositorio expuesto.Por ejemplo, estos controladores utilizan
spring.data.rest.basePath
la configuración Spring Boot como ruta base para el enrutamiento.Consulte Anulación de los controladores de respuesta REST de Spring Data .
Tenga en cuenta que debe agregar,
@ResponseBody
ya que se pierde en@RepositoryRestController
Si no expuso el repositorio (marcado como
@RepositoryRestResource(exported = false)
), use la@BasePathAwareController
anotación en su lugarTambién tenga cuidado con las bolsas
ControllerLinkBuilder
no tiene en cuenta la ruta base de Spring Data REST y@RequestMapping
no debe usarse en el nivel de clase / tipoy
La ruta base no aparece en HAL
Solución alternativa para corregir el enlace: https://stackoverflow.com/a/51736503/548473
ACTUALIZACIÓN: por fin prefiero no usarlo
@RepositoryRestController
debido a muchas soluciones.fuente