Struttura del servizio RESTful con Java Spring per principianti

11

Sono relativamente nuovo in termini di capacità di sviluppo web Java. Ho un progetto che ritengo possa essere un buon candidato per un servizio RESTful da quello che ho capito poco sulle API. Sto cercando di entrare nei dettagli di come dovrebbe essere strutturato, ma non sto andando da nessuna parte in termini di ricerche su google e leggendo il materiale che ho già. Spero che questo post produrrà qualche convalida e / o reindirizzamento in termini di mie conoscenze e ipotesi su questo argomento.

La mia ipotesi attuale è che il mio servizio RESTful avrà la seguente struttura:

  • Dati database (SQL).
  • Un ORM (sto usando un ORM relativamente impopolare chiamato CPO, ma questo sarebbe semplicemente sostituito con Hibernate con la maggior parte delle persone).
  • Una classe manager Java con metodi che comunicano con l'ORM per ottenere i dati
  • Una classe controller Java / classi che gestisce richiesta mappatura e utilizza @ResponseBody per dirigere / gestire l'URL e le azioni di come i dati viene gestita tramite verbi HTTP ( link potrebbe essere GET richiesta con la parola" dell "nell'URL essendo un parametro che restituirà una matrice JSON di informazioni sui computer dell).
  • Questo servizio dovrebbe essere fatto con Spring Boot, o in qualche modo essere in grado di stare da solo ed essere indipendente da qualsiasi altra applicazione.

Ora supponendo che quanto sopra sia corretto, allora avrei (a un livello molto basilare) un servizio RESTful che qualsiasi applicazione può utilizzare per consumare e utilizzare i dati.

Quindi dì che ho la mia applicazione web. Diciamo che sto creando un'app Web con informazioni sull'hardware del computer e sto utilizzando Spring per creare questa app Web. Ecco le mie ipotesi:

  • Avrei un sacco di punti di vista come JSP, con i JSP che includono HTML, CSS e JavaScript. JavaScript gestirà le chiamate AJAX al controller di questa applicazione come necessario (sotto).
  • Questa applicazione web avrebbe anche un proprio controller per gestire le richieste di URL del app e il routing, e il controller sarebbe quindi utilizzare, per esempio, l'% oggetto% co_de o qualcosa del genere a "parlare" il controllore del servizio di RESTful, ottenere qualunque dato venga passato, riportare i dati alla vista (Javascript, JSP, ecc.) per la visualizzazione.

Sono sulla buona strada, qui? Comprendo che esiste anche un aspetto di autenticazione per i servizi RESTful, ma non sono ancora lì concettualmente (e il mio progetto verrà utilizzato in una rete privata, quindi la sicurezza non è una priorità a questo punto).

Qualsiasi intuizione, critica, conoscenza, feedback o chiarimento è molto apprezzata.

    
posta aCarella 29.06.2016 - 16:39
fonte

2 risposte

16

Ecco uno dei miei esempi kick-off preferiti di struttura per la tua app di riposo a molla.

1. Separazione dei livelli, ogni livello è un singolo modulo / progetto

  • API REST
    • Confezionato come war (potrebbe essere jar se utilizzi spring boot con il server incorporato. Il documento di avvio Spring spiega chiaramente come implementare quindi chiama uber jar . È estremamente semplice.)
    • Ha controller di riposo che gestiscono richieste / risposte
    • dipende dal servizio modulo sottostante
  • servizio
    • Confezionato come jar
    • Astrazioni della logica aziendale, questo livello non ha idea di come comunicare con l'origine dati.
    • Sarà autowired nei controller di riposo
    • Dipende dal modulo DAO / Repository
  • DAO / Repository
    • Confezionato come jar
    • Parla direttamente con l'origine dati, ha operazioni comunemente note come CRUD. Potrebbe essere semplice jdbc, JPA o anche accesso ai file.
    • Dipende dal modulo dominio sotto
  • Dominio
    • Confezionato come jar
    • Ha i tuoi modelli di dominio, normalmente classi POJO. Se stai usando ORM, sono entità ORM.
    • Potrebbe anche avere DTO (Data Transfer Object), che è ancora in fase di dibattito caldo. Usalo o no è la tua chiamata.
  • Puoi aggiungere altri moduli come l'utilità, l'integrazione di terze parti, ecc. ma è consigliabile che quanto sopra sia consigliato.

2. Strumenti di gestione delle build / delle dipendenze (IMHO molto necessario)

Ce ne sono molti, la ricerca di google ti mostrerà. Personalmente mi piace Maven con Spring. Funziona semplicemente per la struttura del progetto sopra.
Si noti inoltre che se si utilizza Maven, esiste un modulo genitore che aggrega tutti i moduli discussi nella sezione 1. Tutti i moduli bullet point corrispondono anche ai moduli Maven.

3. Pensieri sul tuo particolare progetto

Dato che stai usando REST, ti consiglio vivamente di non usare JSP come vista. Puoi usare semplicemente HTML5 + Javascript o qualche framework popolare come AngularJS come vista.
Se insisti a utilizzare JSP, dovrai introdurre un'altra war (app web) con controller e JSP. Il controller riceverà i dati (normalmente in formato JSON / xml) e li analizzerà ai tuoi modelli (POJO) in modo che il tuo JSP possa ottenerli dal controller e fare il display. Pubblicare dati da JSP è il contrario, ho omesso qui.

Non è neanche lontanamente una guida completa poiché questo argomento è abbastanza vasto e dipende in gran parte dalle tue esigenze specifiche, ma i termini qui inclusi sono sufficienti per fare ulteriori ricerche (Google, lo è). Spero che questo ti dia qualche idea su come affrontare.

    
risposta data 01.07.2016 - 07:03
fonte
2

Pur accettando la maggior parte della risposta di @ Minjun.Y, penso che prenderei un approccio leggermente diverso dal livello REST e Web page. Dalla mia lettura della tua domanda, penso che tu voglia esporre al mondo esterno un'interfaccia web e un'interfaccia REST. C'è poco da guadagnare leggendo POJO dal database, trasformando i dati in JSON, quindi di nuovo in POJO per il consumo da parte di JSP.

Preferirei fare in modo che il livello di servizio svolgesse tutto il lavoro reale e aggiungere strati di "presentazione" separati per l'app Web (JSP) e il controller REST. Questi sarebbero controllori separati, in cui il servizio sarebbe stato iniettato. In alternativa, vai con solo un servizio REST e costruisci tutta la logica di presentazione sul lato client come per la risposta precedente.

Inoltre, non sono un grande fan dei moduli Maven. Il modo in cui il nostro negozio Java implementerebbe il tuo progetto sarebbe quello di creare versioni regolari del livello di servizio, quindi rendere i livelli di presentazione dipendenti dall'ultima versione. C'è spazio per la discussione su questo, ma sicuramente funziona per noi. Avremmo l'interfaccia web e le interfacce REST come progetti Maven separati, poiché normalmente vivono in diversi file .war e quindi richiedono una distribuzione separata.

A proposito, vorrei rafforzare la necessità di essere al passo con gli strumenti di gestione delle dipendenze e delle build. Una volta che il tuo progetto raggiunge dimensioni ragionevoli, ne hai bisogno. Strumenti gratuiti come Maven, Jenkins e Nexus rendono la gestione dei rilasci meno problematica.

    
risposta data 01.07.2016 - 10:17
fonte

Leggi altre domande sui tag