Cuándo usar @RestController vs @RepositoryRestResource

87

He estado viendo varios ejemplos de cómo usar Spring con REST . Nuestro objetivo final es una HATEOAS/HALconfiguración de primavera

He visto dos métodos distintos para renderizar REST dentro de Spring

  1. Vía @RestControllerdentro de un controlador

  2. Vía @RepositoryRestResourcedentro de un repositorio

Lo que estoy luchando por encontrar es por qué usarías uno sobre el otro. ¿Al intentar implementar HALcuál es mejor?

El backend de nuestra base de datos es Neo4j .

código
fuente

Respuestas:

61

Ok, entonces la historia corta es que quieres usar el @RepositoryRestResourceya que esto crea un servicio HATEOAS con Spring JPA .

Como puede ver aquí, agregando esta anotación y vinculándola a su Pojo, tiene un servicio HATEOAS completamente funcional sin tener que implementar el método de repositorio o los métodos de servicio REST

Si agrega el, @RestControllerentonces debe implementar cada método que desea exponer por su cuenta y tampoco lo exporta a un formato HATEOAS .

zpontikas
fuente
7
De forma predeterminada, Spring Data REST exportará TODOS los repositorios de interfaz pública de nivel superior. Solo necesita @RepositoryRestResource para NO exportar una interfaz o para modificar los detalles del punto final.
Gregturn
4
Si usa RestController con Spring Data REST, eludirá TODO lo que Spring Data REST proporciona. Para codificar un controlador Spring MVC personalizado que utiliza convertidores de mensajes REST de datos de Spring, etc., busque en BasePathAwareController.
Gregturn
No creo que la respuesta aceptada sea correcta @gregturn tiene la mejor respuesta.
Mark
39

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í .

Jacob Creed
fuente
6
Creo que esto ya no es cierto. Si a @RestControllerusa la misma ruta que a @RepositoryRestResource, no se crearán los puntos finales del repositorio.
Hubert Grzeskowiak
19

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

shaILU
fuente
Puedo ver gente yendo a mi blog, si esta solución funciona, por favor vote.
shaILU
10

@RepositoryRestController anular los controladores REST Spring Data generados por defecto del repositorio expuesto.

Para aprovechar la configuración de Spring Data REST, los convertidores de mensajes, el manejo de excepciones y más, use la @RepositoryRestControlleranotación en lugar de un Spring MVC estándar @Controllero@RestController

Por ejemplo, estos controladores utilizan spring.data.rest.basePathla 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, @ResponseBodyya que se pierde en@RepositoryRestController

Si no expuso el repositorio (marcado como @RepositoryRestResource(exported = false)), use la @BasePathAwareControlleranotación en su lugar

También tenga cuidado con las bolsas

ControllerLinkBuilderno tiene en cuenta la ruta base de Spring Data REST y @RequestMappingno debe usarse en el nivel de clase / tipo

y

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 @RepositoryRestControllerdebido a muchas soluciones.

Grigory Kislin
fuente