Izgradnja jednostavne web aplikacije s Spring Boot i Groovy

1. Pregled

Groovy ima brojne mogućnosti koje bismo možda željeli koristiti u našim web aplikacijama Spring.

Dakle, u ovom uputstvu izradit ćemo jednostavnu todo aplikaciju s Spring Boot i Groovy. Također ćemo istražiti njihove integracijske točke.

2. Todo aplikacija

Naša aplikacija imat će sljedeće značajke:

  • Stvori zadatak
  • Uredi zadatak
  • Izbriši zadatak
  • Pogledajte određeni zadatak
  • Pogledajte sve zadatke

Bit će to Aplikacija temeljena na REST-u i koristit ćemo Maven kao naš alat za izgradnju.

2.1. Ovisnosti Mavena

Uključimo sve ovisnosti potrebne u naš pom.xml datoteka:

 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 test-spring-boot-starter-test 2.2.6.OPUSTI test com.h2database h2 1.4.200 runtime 

Evo nas uključujući proljeće-boot-starter-web za izgradnju REST krajnjih točaka, i uvoz groovy ovisnost o pružanju Groovyjeve podrške našem projektu.

Za sloj postojanosti koristimo spring-boot-starter-data-jpa, i h2 je ugrađena baza podataka.

Također, moramo uključuju gmavenplus-dodatak sa svim ciljevima u pom.xml:

  // ... org.codehaus.gmavenplus gmavenplus-plugin 1.9.0 addSources addTestSources generatedStubs compile generirajTestStubs compileTests removeStubs removeTestStubs 

2.2. Klasa JPA entiteta

Napišimo jednostavan Napraviti Groovy klasa s tri polja - iskaznica, zadatak, i isCompleted:

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

Evo, iskaznica polje je jedinstveni identifikator zadatka. zadatak sadrži detalje zadatka i isCompleted pokazuje je li zadatak dovršen ili nije.

Primijeti da, kada ne pružimo modifikatore pristupa polju, tada će Groovy kompajler to polje učiniti privatnim, a također će generirati getter i setter metode za to.

2.3. Sloj postojanosti

Idemo stvoriti Groovy sučelje - TodoRepository koji provodi JpaRepository. Pobrinut će se za sve CRUD operacije u našoj aplikaciji:

@Repository sučelje TodoRepository proširuje JpaRepository {}

2.4. Razina usluge

The TodoService sučelje sadrži sve apstraktne metode potrebne za našu CRUD operaciju:

sučelje TodoService {Lista findAll () Todo findById (Integer todoId) Todo saveTodo (Todo todo) Todo updateTodo (Todo todo) Todo deleteTodo (Integer todoId)}

The TodoServiceImpl je klasa implementacije koja provodi sve metode TodoService:

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

2.5. Sloj kontrolera

Ajmo sad definirati sve REST API-je u TodoController koja je naša @RestController:

@RestController @RequestMapping ( 'todo') public class TodoController {@Autowired TodoService todoService @GetMapping Popis 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 ('/ {todoIdTodo (TodoIdTodo) Cijeli broj todoId) {todoService.findById todoId}}

Ovdje smo definirali pet krajnjih točaka koje korisnik može nazvati za izvršavanje CRUD operacija.

2.6. Pokretanje aplikacije Spring Boot

Sada, napišite klasu s glavnom metodom koja će se koristiti za pokretanje naše aplikacije:

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

Primijeti da, u Groovyju, upotreba zagrada nije obavezna kada pozivamo metodu prosljeđivanjem argumenata - a to je ono što radimo u gornjem primjeru.

Također, sufiks .razred nije potreban za bilo koji razred u Groovyju zato koristimo SpringBootGroovyApplication direktno.

Sada, definirajmo ovu klasu u pom.xml kao početna klasa:

 com.baeldung.app.SpringBootGroovyApplication 

3. Pokretanje aplikacije

Napokon, naša je aplikacija spremna za pokretanje. Jednostavno bismo trebali pokrenuti SpringBootGroovyApplication klase kao Java program ili pokrenite Maven build:

spring-boot: trčanje

Ovo bi trebalo pokrenuti aplikaciju // localhost: 8080 i trebali bismo biti u mogućnosti pristupiti njegovim krajnjim točkama.

4. Testiranje aplikacije

Naša je aplikacija spremna za testiranje. Stvorimo Groovy klasu - TodoAppTest kako bismo testirali našu aplikaciju.

4.1. Početno postavljanje

Definirajmo tri statičke varijable - API_ROOT, readingTodoId, i writingTodoId u našem razredu:

static API_ROOT = "// localhost: 8080 / todo" statičko čitanjeTodoId statičko pisanjeTodoId

Evo, API_ROOT sadrži korijenski URL naše aplikacije. The readingTodoId i writingTodoId primarni su ključevi naših testnih podataka koje ćemo kasnije koristiti za provođenje testiranja.

Ajmo sada stvoriti drugu metodu - populateDummyData () pomoću bilješke @BeforeClass za popunjavanje test podataka:

@BeforeClass static void populateDummyData () {Todo readingTodo = novi Todo (zadatak: 'Čitanje', isCompleted: false) Todo writingTodo = novi Todo (zadatak: 'Pisanje', isCompleted: false) konačni odgovor responseResponse = 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.giveNPL. (writingTodo) .post (API_ROOT) Todo writingTodoResponse = writingResponse.as Todo.class writingTodoId = writingTodoResponse.getId ()}

Također ćemo popuniti varijable - readingTodoId i writingTodoId na isti način za pohranu primarnog ključa zapisa koje spremamo.

Primijeti da, u Groovyu također možemo inicijalizirati grah koristeći imenovane parametre i zadani konstruktor kao što radimo za grah poput čitanjeTodo i pisanjeTodo u gornjem isječku.

4.2. Testiranje CRUD operacija

Dalje, pronađimo sve zadatke s popisa zadataka:

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

Zatim, pronalazimo određeni zadatak usput readingTodoId koje smo ranije naselili:

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

Ovdje smo koristili interpolaciju za spajanje niza URL-a.

Nadalje, pokušajmo ažurirati zadatak na popisu zadataka pomoću 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) API. OK.value (), response.getStatusCode () Todo todoResponse = response.as Todo.class assertTrue todoResponse.getIsCompleted ()}

A zatim obrišite zadatak s popisa zadataka pomoću writingTodoId:

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

Napokon, možemo spremiti novi zadatak:

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

5. Zaključak

U ovom smo članku koristili Groovy i Spring Boot za izgradnju jednostavne aplikacije. Također smo vidjeli kako se mogu integrirati zajedno i demonstrirali neke od sjajnih značajki Groovyja na primjerima.

Kao i uvijek, puni izvorni kod primjera dostupan je na GitHub-u.