Membangun Aplikasi Web Sederhana dengan Spring Boot dan Groovy

1. Ikhtisar

Groovy memiliki sejumlah kemampuan yang mungkin ingin kami gunakan di aplikasi web Spring kami.

Jadi, dalam tutorial ini, kita akan membuat aplikasi rencana sederhana dengan Spring Boot dan Groovy. Juga, kami akan menjelajahi titik integrasi mereka.

2. Aplikasi Todo

Aplikasi kita akan memiliki beberapa fitur berikut:

  • Buat tugas
  • Edit tugas
  • Hapus tugas
  • Lihat tugas tertentu
  • Lihat semua tugas

Ini akan menjadi aplikasi berbasis REST dan kami akan menggunakan Maven sebagai alat pembuatan kami .

2.1. Dependensi Maven

Mari sertakan semua dependensi yang diperlukan dalam file pom.xml kita :

 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, kita termasuk semi-boot-starter-web untuk endpoint membangun SISA , dan mengimpor asyik ketergantungan untuk memberikan dukungan Groovy untuk proyek kami .

Untuk lapisan persistensi, kami menggunakan spring-boot-starter-data-jpa , dan h2 adalah database yang disematkan .

Selain itu, kita harus menyertakan gmavenplus-plugin dengan semua tujuan di pom.xml:

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

2.2. Kelas Entitas JPA

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

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

Di sini, bidang id adalah pengenal unik dari tugas tersebut. tugas berisi detail tugas dan isCompleted memperlihatkan apakah tugas selesai atau belum.

Perhatikan bahwa, jika kita tidak menyediakan pengubah akses ke bidang tersebut, maka compiler Groovy akan menjadikan bidang tersebut sebagai pribadi dan juga akan menghasilkan metode pengambil dan penyetel untuknya .

2.3. Lapisan Persistensi

Mari buat antarmuka Groovy - TodoRepository yang mengimplementasikan JpaRepository . Ini akan menangani semua operasi CRUD di aplikasi kita:

@Repository interface TodoRepository extends JpaRepository {}

2.4. Lapisan Layanan

The TodoService antarmuka berisi semua metode 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 implementasi yang menerapkan semua metode 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 Pengontrol

Sekarang, mari kita definisikan semua REST API 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 menetapkan lima titik akhir yang dapat dipanggil pengguna untuk melakukan operasi CRUD.

2.6. Bootstrap Aplikasi Spring Boot

Sekarang, mari kita tulis kelas dengan metode utama yang akan digunakan untuk memulai aplikasi kita:

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

Perhatikan bahwa, di Groovy, penggunaan tanda kurung bersifat opsional saat memanggil metode dengan meneruskan argumen - dan inilah yang kita lakukan pada contoh di atas.

Selain itu, sufiks .class tidak diperlukan untuk semua kelas di Groovy , itulah sebabnya kami menggunakan SpringBootGroovyApplication secara langsung.

Sekarang, mari kita definisikan kelas ini di pom.xml sebagai kelas-mulai :

 com.baeldung.app.SpringBootGroovyApplication 

3. Menjalankan Aplikasi

Akhirnya, aplikasi kita siap dijalankan. Kita cukup menjalankan kelas SpringBootGroovyApplication sebagai aplikasi Java atau menjalankan build Maven:

spring-boot:run

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

4. Menguji Aplikasi

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

4.1. Pengaturan 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

Pada artikel ini, kami telah menggunakan Groovy dan Spring Boot untuk membuat aplikasi sederhana. Kami juga telah melihat bagaimana mereka dapat diintegrasikan bersama dan mendemonstrasikan beberapa fitur keren Groovy dengan beberapa contoh.

Seperti biasa, kode sumber lengkap dari contoh ini tersedia di GitHub.