Opbygning af en simpel webapplikation med Spring Boot og Groovy

1. Oversigt

Groovy har en række muligheder, som vi måske vil bruge i vores forårswebapplikationer.

Så i denne vejledning bygger vi en simpel todo-applikation med Spring Boot og Groovy. Vi vil også undersøge deres integrationspunkter.

2. Todo ansøgning

Vores applikation har følgende funktioner:

  • Opret opgave
  • Rediger opgave
  • Slet opgave
  • Vis specifik opgave
  • Se alle opgaver

Det bliver en REST-baseret applikation og vi bruger Maven som vores byggeværktøj.

2.1. Maven afhængigheder

Lad os medtage alle de afhængigheder, der kræves i vores pom.xml fil:

 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 

Her er vi inklusive spring-boot-starter-web at oprette REST-slutpunkterog importerer groovy afhængighed af at give Groovy support til vores projekt.

Til persistenslaget bruger vi spring-boot-starter-data-jpaog h2 er den integrerede database.

Vi skal også omfatte gmavenplus-plugin med alle målene i pom.xml:

  // ... org.codehaus.gmavenplus gmavenplus-plugin 1.9.0 addSources addTestSources generereStubs kompilere generereTestStubs kompilereTests fjerneStubs fjerneTestStubs 

2.2. JPA-enhedsklasse

Lad os skrive en simpel At gøre Groovy klasse med tre felter - id, opgave, og erFuldført:

@Entity @Table (name = 'todo') klasse Todo {@Id @GeneratedValue (strategi = GenerationType.IDENTITY) Heltals-id @Column String-opgave @Column Boolean isCompleted}

Her, den id felt er den unikke id for opgaven. opgave indeholder detaljerne i opgaven og erFuldført viser, om opgaven er afsluttet eller ej.

Læg mærke til det, når vi ikke leverer adgangsmodifikatorer til marken, vil Groovy-kompilatoren gøre dette felt som privat og også generere getter- og settermetoder til det.

2.3. Persistenslaget

Lad os Opret en Groovy-grænseflade - TodoRepository som implementerer JpaRepository. Det tager sig af alle CRUD-operationer i vores applikation:

@Repository interface TodoRepository udvider JpaRepository {}

2.4. Servicelaget

Det TodoService interface indeholder alle de abstrakte metoder, der kræves til vores CRUD-operation:

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

Det TodoServiceImpl er en implementeringsklasse som implementerer alle metoderne til TodoService:

@Service-klasse TodoServiceImpl implementerer TodoService {// ... @Override List findAll () {todoRepository.findAll ()} @Override Todo findById (Integer todoId) {todoRepository.findById todoId get ()} @Override Todo saveTod {todoRepository.save todo} @Override Todo updateTodo (Todo todo) {todoRepository.save todo} @Override Todo deleteTodo (Integer todoId) {todoRepository.deleteById todoId}}

2.5. Controller-laget

Lad os nu definere alle REST API'erne i TodoController hvilket er vores @RestController:

@RestController @RequestMapping ('todo') offentlig klasse TodoController {@Autowired TodoService todoService @GetMapping List getAllTodoList () {todoService.findAll ()} @PostMapping Todo saveTodo (@RequestBody Todo todo) {todoSodo. (@RequestBody Todo todo) {todoService.updateTodo todo} @DeleteMapping ('/ {todoId}') deleteTodo (@PathVariable Integer todoId) {todoService.deleteTodo todoId} @GetMapping ('/ {todoId}') Todo get Todo Heltal todoId) {todoService.findById todoId}}

Her har vi defineret fem slutpunkter, som brugeren kan ringe til for at udføre CRUD-operationer.

2.6. Bootstrapping Spring Boot-applikationen

Lad os nu skrive en klasse med den vigtigste metode, der vil blive brugt til at starte vores ansøgning:

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

Læg mærke til det, i Groovy er brugen af ​​parentes valgfri når vi kalder en metode ved at sende argumenter - og det er det, vi laver i eksemplet ovenfor.

Også, suffikset .klasse er ikke nødvendigt til nogen klasse i Groovy Derfor bruger vi SpringBootGroovyApplication direkte.

Lad os nu definere denne klasse i pom.xml som startklasse:

 com.baeldung.app.SpringBootGroovyApplication 

3. Kørsel af applikationen

Endelig er vores ansøgning klar til at køre. Vi skal simpelthen køre SpringBootGroovyApplication klasse som Java-applikationen eller kør Maven build:

spring-boot: løb

Dette skal starte applikationen den // localhost: 8080 og vi skal være i stand til at få adgang til dens slutpunkter.

4. Test af applikationen

Vores ansøgning er klar til test. Lad os oprette en Groovy-klasse - TodoAppTest for at teste vores ansøgning.

4.1. Første opsætning

Lad os definere tre statiske variabler - API_ROOT, readingTodoId, og writingTodoId i vores klasse:

statisk API_ROOT = "// localhost: 8080 / todo" statisk læsningTodoId statisk skrivningTodoId

Her, den API_ROOT indeholder rod-URL'en til vores app. Det readingTodoId og writingTodoId er de primære nøgler til vores testdata, som vi senere bruger til at udføre test.

Lad os nu oprette en anden metode - populateDummyData () ved hjælp af kommentaren @BeforeClass at udfylde testdataene:

@BeforeClass statisk ugyldig populateDummyData () {Todo readingTodo = ny Todo (opgave: '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 () Media. (writingTodo) .post (API_ROOT) Todo writingTodoResponse = writingResponse.as Todo.class writingTodoId = writingTodoResponse.getId ()}

Vi udfylder også variabler - readingTodoId og writingTodoId i samme metode til at gemme den primære nøgle til de poster, vi gemmer.

Læg mærke til det, i Groovy kan vi også initialisere bønner ved hjælp af navngivne parametre og standardkonstruktøren som vi gør for bønner som læserTodo og writingTodo i ovenstående uddrag.

4.2. Test af CRUD-operationer

Lad os derefter finde alle opgaverne fra todo-listen:

@Test ugyldig nårGetAllTodoList_thenOk () {final Response response = RestAssured.get (API_ROOT) assertEquals HttpStatus.OK.value (), response.getStatusCode () assertTrue response.as (List.class) .størrelse ()> 0}

Lad os derefter finde en bestemt opgave ved at passere readingTodoId som vi tidligere har befolket:

@Test ugyldigt nårGetTodoById_thenOk () {final Response response = RestAssured.get ("$ API_ROOT / $ readingTodoId") assertEquals HttpStatus.OK.value (), response.getStatusCode () Todo todoResponse = respons.as Todo.ass. .getId ()}

Her har vi brugt interpolation til at sammenkæde URL-strengen.

Lad os desuden prøve at opdatere opgaven i todo-listen ved hjælp af readingTodoId:

@Test ugyldig nårUpdateTodoById_thenOk () {Todo todo = new Todo (id: readingTodoId, isCompleted: true) final Response response = RestAssured.given () .contentType (MediaType.APPLICATION_JSON_VALUE) .body (todo) .put (API_RO). OK.value (), response.getStatusCode () Todo todoResponse = respons.as Todo.class assertTrue todoResponse.getIsCompleted ()}

Og derefter slette opgaven i todo-listen ved hjælp af writingTodoId:

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

Endelig kan vi gemme en ny opgave:

@Test ugyldigt nårSaveTodo_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 (), respons.getStatusCode ()}

5. Konklusion

I denne artikel har vi brugt Groovy og Spring Boot til at opbygge en simpel applikation. Vi har også set, hvordan de kan integreres sammen og demonstreret nogle af de seje funktioner i Groovy med eksempler.

Som altid er den fulde kildekode for eksemplet tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found