Erstellen einer einfachen Webanwendung mit Spring Boot und Groovy

1. Übersicht

Groovy verfügt über eine Reihe von Funktionen, die wir möglicherweise in unseren Spring-Webanwendungen verwenden möchten.

In diesem Tutorial erstellen wir eine einfache Aufgabenanwendung mit Spring Boot und Groovy. Außerdem werden wir ihre Integrationspunkte untersuchen.

2. Todo-Anwendung

Unsere Anwendung verfügt über folgende Funktionen:

  • Aufgabe erstellen
  • Aufgabe bearbeiten
  • Aufgabe löschen
  • Spezifische Aufgabe anzeigen
  • Alle Aufgaben anzeigen

Es wird eine REST-basierte Anwendung sein und wir werden Maven als Build-Tool verwenden .

2.1. Maven-Abhängigkeiten

Nehmen wir alle erforderlichen Abhängigkeiten in unsere Datei pom.xml auf :

 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 

Hier, wir einschließlich Feder-boot-Starter-Bahn zu bauen REST - Endpunkten und der Import der groovy Abhängigkeit Groovy Unterstützung für unser Projekt zur Verfügung zu stellen .

Für die Persistenzschicht verwenden wir Spring-Boot-Starter-Data-JPA , und h2 ist die eingebettete Datenbank .

Auch wir haben zählen gmavenplus-Plugin mit allen Zielen in der pom.xml:

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

2.2. JPA-Entitätsklasse

Schreiben wir eine einfache Todo Groovy-Klasse mit drei Feldern - id , task und isCompleted :

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

Hier ist das ID- Feld die eindeutige Kennung der Aufgabe. Die Aufgabe enthält die Details der Aufgabe und isCompleted zeigt an, ob die Aufgabe abgeschlossen ist oder nicht.

Beachten Sie, dass der Groovy-Compiler dieses Feld als privat festlegt, wenn wir keine Zugriffsmodifikatoren für das Feld bereitstellen, und auch Getter- und Setter-Methoden dafür generiert .

2.3. Die Persistenzschicht

Erstellen wir eine Groovy-Schnittstelle - TodoRepository, die JpaRepository implementiert . Es kümmert sich um alle CRUD-Operationen in unserer Anwendung:

@Repository interface TodoRepository extends JpaRepository {}

2.4. Die Serviceschicht

Die TodoService- Schnittstelle enthält alle abstrakten Methoden, die für unsere CRUD-Operation erforderlich sind :

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

Der TodoServiceImpl ist eine Implementierungsklasse, die alle Methoden von TodoService implementiert:

@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. Die Controller-Schicht

Definieren wir nun alle REST-APIs im TodoController , unserem @ 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 } }

Hier haben wir fünf Endpunkte definiert, die der Benutzer aufrufen kann, um CRUD-Operationen auszuführen.

2.6. Bootstrapping der Spring Boot-Anwendung

Schreiben wir nun eine Klasse mit der Hauptmethode, mit der unsere Anwendung gestartet wird:

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

Beachten Sie, dass in Groovy die Verwendung von Klammern optional ist, wenn eine Methode durch Übergeben von Argumenten aufgerufen wird. Dies tun wir im obigen Beispiel.

Außerdem wird das Suffix .class für keine Klasse in Groovy benötigt , weshalb wir die SpringBootGroovyApplication direkt verwenden.

Definieren wir diese Klasse in pom.xml als Startklasse :

 com.baeldung.app.SpringBootGroovyApplication 

3. Ausführen der Anwendung

Endlich ist unsere Anwendung betriebsbereit. Wir sollten einfach die SpringBootGroovyApplication- Klasse als Java-Anwendung ausführen oder den Maven-Build ausführen:

spring-boot:run

Dies sollte die Anwendung auf // localhost: 8080 starten und wir sollten in der Lage sein, auf ihre Endpunkte zuzugreifen.

4. Testen der Anwendung

Unsere Anwendung ist bereit zum Testen. Erstellen wir eine Groovy-Klasse - TodoAppTest , um unsere Anwendung zu testen.

4.1. Ersteinrichtung

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 diesem Artikel haben wir Groovy und Spring Boot verwendet, um eine einfache Anwendung zu erstellen. Wir haben auch gesehen, wie sie zusammen integriert werden können, und einige der coolen Funktionen von Groovy anhand von Beispielen demonstriert.

Wie immer ist der vollständige Quellcode des Beispiels auf GitHub verfügbar.