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.