Изграждане на просто уеб приложение с Spring Boot и Groovy

1. Общ преглед

Groovy има редица възможности, които бихме могли да използваме в нашите уеб приложения за Spring.

И така, в този урок ще изградим просто приложение todo с Spring Boot и Groovy. Освен това ще проучим техните точки за интеграция.

2. Приложение Todo

Нашето приложение ще има следните функции:

  • Създаване на задача
  • Редактиране на задачата
  • Изтриване на задача
  • Преглед на конкретна задача
  • Вижте всички задачи

Това ще бъде базирано на REST приложение и ще използваме Maven като наш инструмент за изграждане .

2.1. Зависимости на Maven

Нека включим всички необходими зависимости в нашия файл 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 

Тук включваме spring-boot-starter-web, за да изградим REST крайни точки и импортираме groovy зависимостта, за да осигурим Groovy поддръжка на нашия проект .

За устойчивостта използваме spring-boot-starter-data-jpa , а h2 е вградената база данни .

Също така трябва да включим gmavenplus-plugin с всички цели в pom.xml:

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

2.2. JPA клас на обекта

Нека напишем прост клас на Todo Groovy с три полета - id , task и isCompleted :

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

Тук полето id е уникалният идентификатор на задачата. task съдържа подробности за задачата и isCompleted показва дали задачата е завършена или не.

Забележете, че когато не предоставим модификатори за достъп до полето, тогава компилаторът на Groovy ще направи това поле като частно и също така ще генерира методи за получаване и задаване за него .

2.3. Устойчивостта

Нека създадем интерфейс Groovy - TodoRepository, който реализира JpaRepository . Той ще се погрижи за всички CRUD операции в нашето приложение:

@Repository interface TodoRepository extends JpaRepository {}

2.4. Сервизният слой

Интерфейсът TodoService съдържа всички абстрактни методи, необходими за нашата CRUD операция :

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

В TodoServiceImpl е клас на изпълнение , която внедрява всички методи на 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. Слоят на контролера

Сега, нека дефинираме всички REST API в TodoController, който е нашият @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 } }

Тук дефинирахме пет крайни точки, които потребителят може да извика за извършване на CRUD операции.

2.6. Стартиране на приложението Spring Boot

Сега, нека напишем клас с основния метод, който ще бъде използван за стартиране на нашето приложение:

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

Забележете, че в Groovy използването на скоби не е задължително при извикване на метод чрез предаване на аргументи - и това е, което правим в горния пример.

Също така суфиксът .class не е необходим за нито един клас в Groovy , затова използваме директно SpringBootGroovyApplication .

Сега, нека дефинираме този клас в pom.xml като начален клас :

 com.baeldung.app.SpringBootGroovyApplication 

3. Стартиране на приложението

И накрая, нашето приложение е готово за стартиране. Трябва просто да стартираме клас SpringBootGroovyApplication като Java приложение или да стартираме компилацията Maven:

spring-boot:run

Това трябва да стартира приложението на // localhost: 8080 и трябва да имаме достъп до неговите крайни точки.

4. Тестване на приложението

Нашето приложение е готово за тестване. Нека създадем Groovy клас - TodoAppTest, за да тестваме нашето приложение.

4.1. Първоначалната настройка

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

В тази статия използвахме Groovy и Spring Boot, за да създадем просто приложение. Също така видяхме как те могат да бъдат интегрирани заедно и демонстрирахме някои от страхотните функции на Groovy с примери.

Както винаги, пълният изходен код на примера е достъпен в GitHub.