Estructura del servicio RESTful con Java Spring para principiantes

12

Soy relativamente nuevo en términos de habilidades de desarrollo web Java. Tengo un proyecto que creo que sería un buen candidato para un servicio RESTful por lo poco que entiendo sobre las API. Estoy tratando de entrar en detalles sobre cómo se supone que está estructurado, pero en realidad no llego a ninguna parte en términos de búsquedas en Google y leer el material que ya tengo. Espero que esta publicación produzca alguna validación y / o redirección en términos de mi conocimiento y suposiciones sobre este tema.

Mi suposición actual es que mi servicio RESTful tendrá la siguiente estructura:

  • Datos de la base de datos (SQL).
  • Un ORM (estoy usando un ORM relativamente impopular llamado CPO, pero esto simplemente se reemplazaría con Hibernate con la mayoría de las personas).
  • Una clase de administrador de Java con métodos que hablan con el ORM para obtener los datos.
  • Una clase / clases de controlador Java que maneja la asignación de solicitudes y las utiliza @ResponseBodypara dirigir / manejar la URL y las acciones de cómo se manejan los datos a través de verbos HTTP ( http://mysite.com/computers/dell puede GETsolicitarse con la palabra "dell" en la URL es un parámetro que devolverá una matriz JSON de información sobre computadoras dell).
  • Este servicio debe hacerse con Spring Boot, o de alguna manera ser capaz de ser independiente y ser independiente de cualquier otra aplicación.

Ahora, suponiendo que lo anterior es correcto, entonces tendría (en un nivel muy básico) un servicio RESTful que cualquier aplicación puede usar para consumir y usar datos.

Digamos que tengo mi aplicación web. Digamos que estoy haciendo una aplicación web sobre información de hardware de computadora, y estoy usando Spring para construir esta aplicación web. Aquí están mis suposiciones:

  • Tendría muchas vistas como JSP, con las JSP que incluyen HTML, CSS y JavaScript. El JavaScript manejaría las llamadas AJAX al controlador de esta aplicación según sea necesario (a continuación).
  • Esta aplicación web también tendría su propio controlador para manejar las solicitudes de URL de la aplicación y el enrutamiento, y luego usaría, digamos, el ModelAndViewobjeto o algo por el estilo para "hablar" con el controlador del servicio RESTful, obtener los datos que se pasan , devuelva esos datos a la vista (Javascript, JSP, etc.) para su visualización.

¿Estoy en el camino correcto, aquí? Entiendo que también hay un aspecto de autenticación para los servicios RESTful, pero todavía no estoy allí conceptualmente (y mi proyecto se va a utilizar en una red privada, por lo que la seguridad no es una prioridad en este momento).

Cualquier idea, crítica, conocimiento, retroalimentación o aclaración es muy apreciada.

aCarella
fuente

Respuestas:

19

Este es uno de mis ejemplos de estructura de lanzamiento favoritos para su aplicación de descanso de primavera.

1. Separación de capas, cada capa es un módulo / proyecto individual

  • API REST
    • Empaquetado como war (podría ser jar si está utilizando Spring Boot con un servidor incorporado. Spring boot doc explica claramente cómo implementar el llamado uber jar . Es muy simple).
    • Tiene controladores de descanso que manejan solicitudes / respuestas
    • depende del módulo de servicio a continuación
  • Servicio
    • Empaquetado como frasco
    • Abstracciones de lógica de negocios, esta capa no tiene idea de cómo comunicarse con la fuente de datos.
    • Se cableará automáticamente en controladores de descanso
    • Depende del módulo DAO / Repository a continuación
  • DAO / Repositorio
    • Empaquetado como frasco
    • Habla directamente con la fuente de datos, tiene operaciones comúnmente conocidas como CRUD. Podría ser simple jdbc, JPA o incluso acceso a archivos.
    • Depende del módulo de dominio a continuación
  • Dominio
    • Empaquetado como frasco
    • Tiene sus modelos de dominio, normalmente clases de POJO. Si está utilizando ORM, son entidades ORM.
    • También podría tener DTO (Objeto de transferencia de datos), que todavía están en debate. Úselo o no es su decisión.
  • Puede agregar más módulos como utilidades, integración de terceros, etc. pero se recomienda encarecidamente lo anterior.

2. Herramientas de gestión de construcción / dependencia (muy necesario en mi humilde opinión)

Hay muchos de ellos, la búsqueda de Google te mostrará. Personalmente me gusta Maven con Spring. Simplemente funciona para la estructura del proyecto anterior.
También tenga en cuenta que si está utilizando maven, hay un módulo padre que agrega todos los módulos discutidos en la sección 1. Todos los módulos de viñetas también corresponden a los módulos maven.

3. Reflexiones sobre tu proyecto particular

Como está utilizando REST, le recomiendo que NO use JSP como su vista. Puede usar HTML5 + Javascript simple o algún marco popular como AngularJS como su vista.
Si insiste en usar JSP, necesitará introducir otra guerra (aplicación web) que tenga controladores y JSP. El controlador obtendrá los datos (normalmente formato Json / xml) y luego los analizará a sus modelos (POJO) para que su JSP pueda obtenerlos de su controlador y hacer la visualización. Publicar datos de JSP es lo contrario, omití aquí.

No está cerca de una guía completa ya que este tema es bastante grande y depende en gran medida de sus requisitos específicos, pero los términos incluidos aquí son suficientes para que realice una investigación adicional (Google, lo es). Esperemos que esto le dé algunas ideas sobre cómo abordar.

Minjun Yu
fuente
1
El dominio suele ser la capa que contiene la lógica empresarial. El dominio generalmente también se conoce como la capa que contiene los servicios. Los objetos de dominio no son POJO simples, el objeto de dominio debe contener lógica empresarial, como la validación de argumentos y como tal. Probablemente sería mejor cambiar el nombre de la capa a otra cosa. La capa de repositorio también se usa con bastante frecuencia para transferir datos de múltiples fuentes a los objetos de su dominio.
Andy
¿Los módulos de servicio y repositorio serán proyectos Spring también?
Glenn Van Schil
1
@GlennVanSchil No, no tiene que ser proyectos Spring b / c cuando se construye todo el proyecto, la capa de repositorio / servicio se incluirá en el classpath. El @Autowirefuncionará como resultado.
Minjun Yu
@MinjunYu ¡Gracias por la respuesta clara! Pero su repositorio / servicio necesita primavera como dependencia de Maven para las anotaciones de Servicio, Repositorio o Componente, ¿estoy en lo cierto?
Glenn Van Schil
1
@GlennVanSchil Si coloca todas las dependencias de Spring Maven en el pom.xml del módulo principal, entonces no es necesario agregar ninguna dependencia relacionada con Spring en módulos secundarios (módulos de repositorio / servicio). Esta es solo una forma de diseñar proyectos de módulos múltiples en primavera. El propósito es organizar su código. Si su proyecto no es tan grande y no cambiará en el futuro previsible, puede combinar el dominio, el repositorio y el servicio en el mismo módulo llamado "núcleo". Se ve aún más limpio.
Minjun Yu
2

Si bien estoy de acuerdo con la mayoría de las respuestas de @ Minjun.Y, creo que tomaría un enfoque ligeramente diferente para la capa REST y la página web. De mi lectura de su pregunta, creo que desea exponer tanto una interfaz web como una interfaz REST al mundo exterior. Hay poco que ganar leyendo POJO de la base de datos, convirtiendo los datos en JSON y luego nuevamente en POJO para que los JSP los consuman.

Me gustaría hacer que la capa de servicio haga todo el trabajo real y agregar capas separadas de "presentación" para la aplicación web (JSP) y el controlador REST. Estos serían controladores separados, en los que se inyectaría el servicio. Alternativamente, vaya con solo un servicio REST y construya toda la lógica de presentación en el lado del cliente según la respuesta anterior.

Además, no soy un gran fanático de los módulos Maven. La forma en que nuestra tienda Java implementaría su proyecto sería hacer lanzamientos regulares de la capa de servicio, luego hacer que las capas de presentación dependan de la última versión. Hay espacio para la discusión sobre esto, pero ciertamente nos funciona. Tendríamos la interfaz web y las interfaces REST como proyectos Maven separados, ya que normalmente viven en diferentes archivos .war y, por lo tanto, requieren una implementación separada.

Por cierto, reforzaría la necesidad de ponerme al día con las herramientas de gestión de dependencia y compilación. Una vez que su proyecto crezca a un tamaño razonable, los necesitará. Las herramientas gratuitas como Maven, Jenkins y Nexus hacen que la administración de versiones sea menos problemática.

kiwiron
fuente