Membangun Aplikasi Web Mudah dengan Spring Boot dan Groovy

1. Gambaran keseluruhan

Groovy mempunyai sebilangan kemampuan yang mungkin ingin kita gunakan dalam aplikasi web Spring kita.

Oleh itu, dalam tutorial ini, kami akan membina aplikasi todo sederhana dengan Spring Boot dan Groovy. Juga, kita akan meneroka titik integrasi mereka.

2. Permohonan Todo

Aplikasi kami akan mempunyai ciri-ciri berikut:

  • Buat tugas
  • Edit tugas
  • Padamkan tugas
  • Lihat tugas tertentu
  • Lihat semua tugas

Ini akan menjadi aplikasi berasaskan REST dan kami akan menggunakan Maven sebagai alat binaan kami .

2.1. Ketergantungan Maven

Mari sertakan semua kebergantungan yang diperlukan dalam fail pom.xml kami :

 org.springframework.boot spring-boot-starter-data-jpa 2.2.6.RELEASE   org.springframework.boot spring-boot-starter-web 2.2.6.RELEASE   org.codehaus.groovy groovy 3.0.3   org.springframework.boot spring-boot-starter-test 2.2.6.RELEASE test   com.h2database h2 1.4.200 runtime 

Di sini, kami menyertakan web spring-boot-starter untuk membina titik akhir REST , dan mengimport kebergantungan groovy untuk memberikan sokongan Groovy ke projek kami .

Untuk lapisan ketekunan, kami menggunakan spring-boot-starter-data-jpa , dan h2 adalah pangkalan data terbenam .

Juga, kita mesti memasukkan gmavenplus-plugin dengan semua matlamat dalam pom.xml:

  //...  org.codehaus.gmavenplus gmavenplus-plugin 1.9.0    addSources addTestSources generateStubs compile generateTestStubs compileTests removeStubs removeTestStubs      

2.2. Kelas Entiti JPA

Mari tulis kelas Todo Groovy sederhana dengan tiga bidang - id , tugas, dan selesai :

@Entity @Table(name = 'todo') class Todo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Integer id @Column String task @Column Boolean isCompleted }

Di sini, medan id adalah pengecam unik tugas. tugas mengandungi perincian tugas dan Is Selesai menunjukkan sama ada tugas itu selesai atau tidak.

Perhatikan bahawa, apabila kita tidak menyediakan pengubah akses ke lapangan, maka penyusun Groovy akan menjadikan medan itu sebagai peribadi dan juga akan menghasilkan kaedah mendapatkan dan menetapkan untuk itu .

2.3. Lapisan Kegigihan

Mari buat antara muka Groovy - TodoRepository yang menerapkan JpaRepository . Ini akan mengurus semua operasi CRUD dalam aplikasi kami:

@Repository interface TodoRepository extends JpaRepository {}

2.4. Lapisan Perkhidmatan

Antara muka TodoService mengandungi semua kaedah abstrak yang diperlukan untuk operasi CRUD kami :

interface TodoService { List findAll() Todo findById(Integer todoId) Todo saveTodo(Todo todo) Todo updateTodo(Todo todo) Todo deleteTodo(Integer todoId) }

The TodoServiceImpl adalah kelas pelaksanaan yang melaksanakan semua kaedah TodoService:

@Service class TodoServiceImpl implements TodoService { //... @Override List findAll() { todoRepository.findAll() } @Override Todo findById(Integer todoId) { todoRepository.findById todoId get() } @Override Todo saveTodo(Todo todo){ todoRepository.save todo } @Override Todo updateTodo(Todo todo){ todoRepository.save todo } @Override Todo deleteTodo(Integer todoId){ todoRepository.deleteById todoId } }

2.5. Lapisan Pengawal

Sekarang, mari kita tentukan semua API REST di TodoController yang merupakan @RestController kami :

@RestController @RequestMapping('todo') public class TodoController { @Autowired TodoService todoService @GetMapping List getAllTodoList(){ todoService.findAll() } @PostMapping Todo saveTodo(@RequestBody Todo todo){ todoService.saveTodo todo } @PutMapping Todo updateTodo(@RequestBody Todo todo){ todoService.updateTodo todo } @DeleteMapping('/{todoId}') deleteTodo(@PathVariable Integer todoId){ todoService.deleteTodo todoId } @GetMapping('/{todoId}') Todo getTodoById(@PathVariable Integer todoId){ todoService.findById todoId } }

Di sini, kami telah menentukan lima titik akhir yang boleh dipanggil oleh pengguna untuk melakukan operasi CRUD.

2.6. Bootstrap Aplikasi Boot Musim Semi

Sekarang, mari tulis kelas dengan kaedah utama yang akan digunakan untuk memulakan aplikasi kami:

@SpringBootApplication class SpringBootGroovyApplication { static void main(String[] args) { SpringApplication.run SpringBootGroovyApplication, args } }

Perhatikan bahawa, di Groovy, penggunaan kurungan adalah pilihan ketika memanggil kaedah dengan menyampaikan argumen - dan inilah yang kita lakukan dalam contoh di atas.

Juga, akhiran .class tidak diperlukan untuk mana-mana kelas di Groovy itulah sebabnya kami menggunakan SpringBootGroovyApplication secara langsung.

Sekarang, mari kita tentukan kelas ini dalam pom.xml sebagai kelas permulaan :

 com.baeldung.app.SpringBootGroovyApplication 

3. Menjalankan Aplikasi

Akhirnya, aplikasi kami siap dijalankan. Kita hanya perlu menjalankan kelas SpringBootGroovyApplication sebagai aplikasi Java atau menjalankan build Maven:

spring-boot:run

Ini harus memulakan aplikasi di // localhost: 8080 dan kita seharusnya dapat mengakses titik akhirnya.

4. Menguji Aplikasi

Aplikasi kami sudah siap untuk diuji. Mari buat kelas Groovy - TodoAppTest untuk menguji aplikasi kami.

4.1. Persediaan Awal

Let's define three static variables – API_ROOT, readingTodoId, and writingTodoId in our class:

static API_ROOT = "//localhost:8080/todo" static readingTodoId static writingTodoId

Here, the API_ROOT contains the root URL of our app. The readingTodoId and writingTodoId are the primary keys of our test data which we'll use later to perform testing.

Now, let's create another method – populateDummyData() by using the annotation @BeforeClass to populate the test data:

@BeforeClass static void populateDummyData() { Todo readingTodo = new Todo(task: 'Reading', isCompleted: false) Todo writingTodo = new Todo(task: 'Writing', isCompleted: false) final Response readingResponse = RestAssured.given() .contentType(MediaType.APPLICATION_JSON_VALUE) .body(readingTodo).post(API_ROOT) Todo cookingTodoResponse = readingResponse.as Todo.class readingTodoId = cookingTodoResponse.getId() final Response writingResponse = RestAssured.given() .contentType(MediaType.APPLICATION_JSON_VALUE) .body(writingTodo).post(API_ROOT) Todo writingTodoResponse = writingResponse.as Todo.class writingTodoId = writingTodoResponse.getId() }

We'll also populate variables – readingTodoId and writingTodoId in the same method to store the primary key of the records we're saving.

Notice that, in Groovy we can also initialize beans by using named parameters and the default constructor like we're doing for beans like readingTodo and writingTodo in the above snippet.

4.2. Testing CRUD Operations

Next, let's find all the tasks from the todo list:

@Test void whenGetAllTodoList_thenOk(){ final Response response = RestAssured.get(API_ROOT) assertEquals HttpStatus.OK.value(),response.getStatusCode() assertTrue response.as(List.class).size() > 0 }

Then, let's find a specific task by passing readingTodoId which we've populated earlier:

@Test void whenGetTodoById_thenOk(){ final Response response = RestAssured.get("$API_ROOT/$readingTodoId") assertEquals HttpStatus.OK.value(),response.getStatusCode() Todo todoResponse = response.as Todo.class assertEquals readingTodoId,todoResponse.getId() }

Here, we've used interpolation to concatenate the URL string.

Furthermore, let's try to update the task in the todo list by using readingTodoId:

@Test void whenUpdateTodoById_thenOk(){ Todo todo = new Todo(id:readingTodoId, isCompleted: true) final Response response = RestAssured.given() .contentType(MediaType.APPLICATION_JSON_VALUE) .body(todo).put(API_ROOT) assertEquals HttpStatus.OK.value(),response.getStatusCode() Todo todoResponse = response.as Todo.class assertTrue todoResponse.getIsCompleted() }

And then delete the task in the todo list by using writingTodoId:

@Test void whenDeleteTodoById_thenOk(){ final Response response = RestAssured.given() .delete("$API_ROOT/$writingTodoId") assertEquals HttpStatus.OK.value(),response.getStatusCode() }

Finally, we can save a new task:

@Test void whenSaveTodo_thenOk(){ Todo todo = new Todo(task: 'Blogging', isCompleted: false) final Response response = RestAssured.given() .contentType(MediaType.APPLICATION_JSON_VALUE) .body(todo).post(API_ROOT) assertEquals HttpStatus.OK.value(),response.getStatusCode() }

5. Conclusion

Dalam artikel ini, kami telah menggunakan Groovy dan Spring Boot untuk membina aplikasi mudah. Kami juga telah melihat bagaimana mereka dapat disatukan bersama dan menunjukkan beberapa ciri Groovy yang menarik dengan contoh.

Seperti biasa, kod sumber penuh contoh boleh didapati di GitHub.