Creazione di una semplice applicazione Web con Spring Boot e Groovy

1. Panoramica

Groovy ha una serie di funzionalità che potremmo voler utilizzare nelle nostre applicazioni web Spring.

Quindi, in questo tutorial, costruiremo una semplice applicazione todo con Spring Boot e Groovy. Inoltre, esploreremo i loro punti di integrazione.

2. Todo Application

La nostra applicazione avrà le seguenti caratteristiche:

  • Crea attività
  • Modifica attività
  • Elimina attività
  • Visualizza attività specifica
  • Visualizza tutte le attività

Sarà un'applicazione basata su REST e useremo Maven come nostro strumento di compilazione .

2.1. Dipendenze di Maven

Includiamo tutte le dipendenze richieste nel nostro file pom.xml :

 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 

Qui, stiamo tra cui la primavera-boot-starter-web per endpoint accumulo REST , e importare il groove dipendenze per fornire supporto Groovy al nostro progetto .

Per il livello di persistenza, stiamo usando spring-boot-starter-data-jpa e h2 è il database incorporato .

Inoltre, dobbiamo includere il plugin gmavenplus con tutti gli obiettivi nel pom.xml:

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

2.2. Classe entità JPA

Scriviamo una semplice classe Todo Groovy con tre campi: id , task e isCompleted :

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

Qui, il campo id è l'identificatore univoco dell'attività. task contiene i dettagli dell'attività e isCompleted mostra se l'attività è stata completata o meno.

Si noti che, quando non forniamo modificatori di accesso al campo, il compilatore Groovy renderà quel campo privato e genererà anche metodi getter e setter per esso .

2.3. Lo strato di persistenza

Cerchiamo di creare un'interfaccia Groovy - TodoRepository che implementa JpaRepository . Si prenderà cura di tutte le operazioni CRUD nella nostra applicazione:

@Repository interface TodoRepository extends JpaRepository {}

2.4. Il livello di servizio

L' interfaccia TodoService contiene tutti i metodi astratti richiesti per la nostra operazione CRUD :

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

Il TodoServiceImpl è una classe di implementazione , che implementa tutti i metodi di 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. Il livello del controller

Ora definiamo tutte le API REST nel TodoController che è il nostro @RestController :

@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 } }

Qui, abbiamo definito cinque endpoint che l'utente può chiamare per eseguire operazioni CRUD.

2.6. Avvio dell'applicazione Spring Boot

Ora, scriviamo una classe con il metodo principale che verrà utilizzato per avviare la nostra applicazione:

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

Si noti che, in Groovy, l'uso delle parentesi è opzionale quando si chiama un metodo passando argomenti - e questo è ciò che stiamo facendo nell'esempio sopra.

Inoltre, il suffisso .class non è necessario per nessuna classe in Groovy , ecco perché stiamo usando SpringBootGroovyApplication direttamente.

Ora definiamo questa classe in pom.xml come classe iniziale :

 com.baeldung.app.SpringBootGroovyApplication 

3. Esecuzione dell'applicazione

Finalmente la nostra applicazione è pronta per essere eseguita. Dovremmo semplicemente eseguire la classe SpringBootGroovyApplication come applicazione Java o eseguire la build Maven:

spring-boot:run

Questo dovrebbe avviare l'applicazione su // localhost: 8080 e dovremmo essere in grado di accedere ai suoi endpoint.

4. Test dell'applicazione

La nostra applicazione è pronta per il test. Creiamo una classe Groovy - TodoAppTest per testare la nostra applicazione.

4.1. Configurazione iniziale

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

In questo articolo, abbiamo utilizzato Groovy e Spring Boot per creare una semplice applicazione. Abbiamo anche visto come possono essere integrati insieme e dimostrato alcune delle fantastiche funzionalità di Groovy con esempi.

Come sempre, il codice sorgente completo dell'esempio è disponibile su GitHub.