Struktur Layanan RESTful dengan Java Spring untuk Pemula

12

Saya relatif baru dalam hal keterampilan pengembangan web Java. Saya memiliki proyek yang menurut saya akan menjadi kandidat yang bagus untuk layanan RESTful dari sedikit yang saya mengerti tentang API. Saya mencoba masuk ke detail bagaimana ini seharusnya disusun, tetapi tidak benar-benar mendapatkan tempat dalam hal pencarian google dan membaca materi yang sudah saya miliki. Saya berharap posting ini akan menghasilkan beberapa validasi dan / atau pengalihan dalam hal pengetahuan dan asumsi saya tentang topik ini.

Asumsi saya saat ini adalah bahwa layanan RESTful saya akan memiliki struktur berikut:

  • Data Database (SQL).
  • ORM (Saya menggunakan ORM yang relatif tidak populer yang disebut CPO, tetapi ini hanya akan diganti dengan Hibernate dengan kebanyakan orang).
  • Kelas manajer Java dengan metode yang berbicara dengan ORM untuk mendapatkan data
  • Kelas / kelas pengontrol Java yang menangani pemetaan permintaan dan penggunaan @ResponseBodyuntuk mengarahkan / menangani URL dan tindakan bagaimana data ditangani melalui kata kerja HTTP ( http://mysite.com/computers/dell mungkin GETdiminta dengan kata "dell" dalam URL menjadi parameter yang akan mengembalikan array informasi JSON tentang komputer Dell).
  • Layanan ini harus dibuat dengan Spring Boot, atau entah bagaimana dapat berdiri sendiri dan terlepas dari aplikasi lain.

Sekarang dengan asumsi bahwa di atas sudah benar, maka saya akan memiliki (pada tingkat yang sangat mendasar) layanan yang tenang yang dapat digunakan aplikasi apa pun untuk menggunakan dan menggunakan data.

Jadi katakan saya kemudian memiliki aplikasi web saya. Katakanlah saya membuat aplikasi web tentang informasi perangkat keras komputer, dan saya menggunakan Spring untuk membangun aplikasi web ini. Inilah asumsi saya:

  • Saya akan memiliki banyak pandangan sebagai JSP, dengan JSP yang menyertakan HTML, CSS, dan JavaScript. JavaScript akan menangani panggilan AJAX ke pengontrol aplikasi ini sesuai kebutuhan (di bawah).
  • Aplikasi web ini juga akan memiliki pengontrol sendiri untuk menangani permintaan dan perutean URL aplikasi, dan pengontrol kemudian akan menggunakan, katakanlah, ModelAndViewobjek atau sesuatu di sepanjang baris itu untuk "berbicara dengan" pengontrol layanan RESTful, memperoleh data apa pun yang sedang dikirimkan , sampaikan data itu kembali ke tampilan (Javascript, JSP, dll ...) untuk ditampilkan.

Apakah saya di jalur yang benar, di sini? Saya mengerti bahwa ada juga aspek otentikasi untuk layanan RESTful, tapi saya belum ada secara konseptual (dan proyek saya akan digunakan dalam jaringan pribadi sehingga keamanan bukanlah prioritas pada saat ini).

Setiap wawasan, kritik, pengetahuan, umpan balik, atau klarifikasi sangat dihargai.

aCarella
sumber

Jawaban:

19

Berikut adalah salah satu contoh struktur kick-off favorit saya untuk aplikasi spring rest Anda.

1. Pemisahan lapisan, setiap lapisan adalah modul / proyek individu

  • API SISA
    • Dikemas sebagai perang (Bisa jadi jar jika Anda menggunakan spring boot dengan server tertanam. Spring boot doc dengan jelas menjelaskan cara menggunakan jar uber yang disebut . Ini sangat sederhana.)
    • Ini memiliki pengendali istirahat yang menangani permintaan / tanggapan
    • tergantung pada Modul Layanan di bawah ini
  • Layanan
    • Dikemas sebagai toples
    • Abstraksi logika bisnis, lapisan ini tidak tahu bagaimana berkomunikasi dengan sumber data.
    • Ini akan diotomatiskan di pengontrol lainnya
    • Tergantung pada modul DAO / Repositori di bawah ini
  • DAO / Repositori
    • Dikemas sebagai toples
    • Berbicara dengan sumber data secara langsung, memiliki operasi yang dikenal sebagai CRUD. Ini bisa berupa jdbc sederhana, JPA, atau bahkan akses file.
    • Tergantung pada modul domain di bawah ini
  • Domain
    • Dikemas sebagai toples
    • Ini memiliki model domain Anda, biasanya kelas POJO. Jika Anda menggunakan ORM, mereka adalah entitas ORM.
    • Bisa juga memiliki DTO (Data Transfer Object), yang masih dalam perdebatan panas. Gunakan itu atau tidak adalah panggilan Anda.
  • Anda dapat menambahkan lebih banyak modul seperti utilitas, integrasi pihak ketiga, dll. Tetapi yang di atas sangat disarankan untuk dimiliki.

2. Alat Manajemen Build / Dependency (IMHO sangat diperlukan)

Ada banyak dari mereka, pencarian google akan menunjukkan kepada Anda. Saya pribadi suka Maven dengan Spring. Ini hanya bekerja untuk struktur proyek di atas.
Perhatikan juga bahwa jika Anda menggunakan maven, ada modul induk yang mengagregasi semua modul yang dibahas di bagian 1. Semua modul poin-poin juga sesuai dengan modul maven.

3. Pikiran tentang proyek khusus Anda

Karena Anda menggunakan REST, saya akan sangat menyarankan agar Anda TIDAK menggunakan JSP sebagai tampilan Anda. Anda dapat menggunakan HTML5 + Javascript biasa atau beberapa kerangka kerja populer seperti AngularJS sebagai tampilan Anda.
Jika Anda bersikeras menggunakan JSP, Anda perlu memperkenalkan perang lain (aplikasi web) yang memiliki pengontrol dan JSP. Pengontrol akan mendapatkan data (Biasanya format Json / xml) dan kemudian menguraikannya ke model Anda (POJO) sehingga JSP Anda bisa mendapatkannya dari pengontrol Anda dan melakukan tampilan. Posting data dari JSP adalah kebalikannya, saya dihilangkan di sini.

Ini sama sekali bukan panduan lengkap karena topik ini cukup besar dan sangat tergantung pada kebutuhan spesifik Anda, tetapi istilah yang disertakan di sini cukup bagi Anda untuk melakukan penelitian tambahan (Google, itu). Semoga ini akan memberi Anda beberapa ide tentang cara pendekatan.

Minjun Yu
sumber
1
Domain biasanya merupakan lapisan yang mengandung logika bisnis. Domain biasanya juga disebut sebagai lapisan yang berisi layanan. Objek domain bukan POJO biasa, objek Domain harus berisi logika bisnis seperti validasi argumen dan karenanya. Mungkin akan lebih baik untuk mengubah nama layer menjadi sesuatu yang lain. Lapisan repositori juga cukup sering digunakan untuk mentransfer data dari berbagai sumber ke objek domain Anda.
Andy
Apakah modul Layanan dan Repositori juga menjadi proyek Musim Semi?
Glenn Van Schil
1
@ GlennVanSchil Tidak, itu tidak harus menjadi proyek Spring b / c ketika seluruh proyek dibangun, repo / lapisan layanan akan dimasukkan dalam classpath. The @Autowireakan bekerja sebagai hasilnya.
Minjun Yu
@MinjunYu Terima kasih atas jawaban yang jelas! Tetapi repo / layanan Anda memang memerlukan pegas sebagai maven dependensi untuk anotasi Layanan, Repositori atau Komponen, apakah saya benar?
Glenn Van Schil
1
@GlennVanSchil Jika Anda meletakkan semua dependensi spring maven di pom.xml dari modul induk, maka tidak perlu menambahkan dependensi terkait pegas dalam modul anak (modul repo / service). Ini hanya satu cara untuk menata proyek multi modul di musim semi. Tujuannya adalah untuk mengatur kode Anda. Jika proyek Anda tidak sebesar itu dan tidak akan berubah di masa mendatang, Anda dapat menggabungkan domain, repo, layanan dalam modul yang sama yang disebut "inti". Terlihat lebih bersih.
Minjun Yu
2

Sementara setuju dengan sebagian besar jawaban dari @ Minjun.Y, saya pikir saya akan mengambil pendekatan yang sedikit berbeda dengan REST dan lapisan halaman Web. Dari bacaan saya atas pertanyaan Anda, saya pikir Anda ingin mengekspos antarmuka web dan antarmuka REST ke dunia luar. Ada sedikit yang bisa diperoleh dengan membaca POJO dari database, mengubah data menjadi JSON, kemudian kembali ke POJO untuk konsumsi oleh JSP.

Saya lebih suka membuat lapisan layanan melakukan semua pekerjaan nyata, dan menambahkan lapisan "presentasi" yang terpisah untuk aplikasi web (JSP) dan pengendali REST. Ini akan menjadi pengontrol terpisah, di mana layanan akan disuntikkan. Atau, gunakan hanya layanan REST dan bangun semua logika presentasi di sisi klien sesuai jawaban sebelumnya.

Juga, saya bukan penggemar modul Maven. Cara toko Java kami akan mengimplementasikan proyek Anda adalah dengan membuat rilis reguler dari lapisan layanan, kemudian membuat lapisan presentasi bergantung pada rilis terbaru. Ada ruang untuk diskusi tentang ini, tetapi tentu saja berhasil bagi kita. Kami akan memiliki antarmuka web dan antarmuka REST sebagai proyek Maven terpisah, karena mereka biasanya hidup dalam file perang yang berbeda dan karenanya memerlukan penyebaran yang terpisah.

BTW, saya akan memperkuat kebutuhan untuk bangun dengan kecepatan dengan alat manajemen pembangunan dan ketergantungan. Setelah proyek Anda tumbuh ke ukuran yang masuk akal, Anda membutuhkannya. Alat gratis seperti Maven, Jenkins dan Nexus membuat manajemen rilis tidak terlalu menjadi masalah.

kiwiron
sumber