1. 概要

Groovy SpringWebアプリケーションで使用したい機能がいくつかあります。

したがって、このチュートリアルでは、Spring BootとGroovyを使用して簡単なtodoアプリケーションを作成します。 また、それらの統合ポイントについても説明します。

2. Todoアプリケーション

このアプリケーションには、次の機能があります。

  • タスクを作成する
  • タスクの編集
  • タスクを削除
  • 特定のタスクを表示
  • すべてのタスクを表示

これはRESTベースのアプリケーションであり、ビルドツールとしてMavenを使用します。

2.1. Mavenの依存関係

pom.xmlファイルに必要なすべての依存関係を含めましょう。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.5.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.5.1</version>
</dependency>
<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>2.5.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
    <scope>runtime</scope>
</dependency>

ここでは、を含めてspring -boot-starter-webを使用してRESTエンドポイントを構築しgroovy依存関係をインポートしてプロジェクトにGroovyサポートを提供しています

永続層にはspring-boot-starter-data-jpaを使用しており、h2は組み込みデータベースです。

また、 pom.xml:にすべての目標を含むgmavenplus-pluginを含める必要があります。

<build>
    <plugins>
        //...
        <plugin>
            <groupId>org.codehaus.gmavenplus</groupId>
            <artifactId>gmavenplus-plugin</artifactId>
            <version>1.9.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>addSources</goal>
                        <goal>addTestSources</goal>
                        <goal>generateStubs</goal>
                        <goal>compile</goal>
                        <goal>generateTestStubs</goal>
                        <goal>compileTests</goal>
                        <goal>removeStubs</goal>
                        <goal>removeTestStubs</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2.2. JPAエンティティクラス

id、task、isCompletedの3つのフィールドを持つ単純なTodoGroovyクラスを作成しましょう。

@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インターフェースを作成しましょう– JpaRepositoryを実装するTodoRepository。 アプリケーションのすべてのCRUD操作を処理します。

@Repository
interface TodoRepository extends JpaRepository<Todo, Integer> {}

2.4. サービスレイヤー

TodoServiceインターフェースには、CRUD操作に必要なすべての抽象メソッドが含まれています。

interface TodoService {

    List<Todo> 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<Todo> 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. コントローラレイヤー

それでは、@RestControllerであるTodoControllerのすべてのRESTAPIを定義しましょう。

@RestController
@RequestMapping('todo')
public class TodoController {

    @Autowired
    TodoService todoService

    @GetMapping
    List<Todo> 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操作を実行するために呼び出すことができる5つのエンドポイントを定義しました。

2.6. SpringBootアプリケーションのブートストラップ

それでは、アプリケーションの起動に使用されるmainメソッドを使用してクラスを作成しましょう。

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

Groovyのでは、引数を渡してメソッドを呼び出す場合、括弧の使用はオプションであることに注意してください。これは、上記の例で行っていることです。

また、接尾辞.classはGroovy のどのクラスにも必要ないため、SpringBootGroovyApplicationを直接使用しています。

それでは、このクラスをpom.xmlstart-classとして定義しましょう。

<properties>
    <start-class>com.baeldung.app.SpringBootGroovyApplication</start-class>
</properties>

3. アプリケーションの実行

これで、アプリケーションを実行する準備が整いました。 SpringBootGroovyApplication クラスをJavaアプリケーションとして実行するか、Mavenビルドを実行するだけです。

spring-boot:run

これにより、 http:// localhost:8080 でアプリケーションが起動し、そのエンドポイントにアクセスできるようになります。

4. アプリケーションのテスト

アプリケーションはテストの準備ができています。 Groovyクラス– TodoAppTestを作成してアプリケーションをテストしましょう。

4.1. 初期設定

クラスでAPI_ROOT readingTodoId、writingTodoIdの3つの静的変数を定義しましょう。

static API_ROOT = "http://localhost:8080/todo"
static readingTodoId
static writingTodoId

ここで、API_ROOTにはアプリのルートURLが含まれています。 readingTodoIdwritingTodoIdは、後でテストを実行するために使用するテストデータの主キーです。

次に、アノテーション @BeforeClass を使用してテストデータを設定することにより、 PopulateDummyData()という別のメソッドを作成しましょう。

@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()
}

保存するレコードの主キーを格納するために、同じメソッドに変数– readingTodoIdwritingTodoIdも入力します。

Groovyでは、上記のreadingTodowritingTodoのようなBeanに対して行っているように、名前付きパラメーターとデフォルトのコンストラクターを使用してBeanを初期化することもできます。スニペット。

4.2. CRUD操作のテスト

次に、todoリストからすべてのタスクを見つけましょう。

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

次に、前に入力した readingTodoId を渡して、特定のタスクを見つけましょう。

@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()
}

ここでは、補間を使用してURL文字列を連結しました。

さらに、 readingTodoId を使用して、todoリストのタスクを更新してみましょう。

@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()
}

次に、writingTodoId を使用して、ToDoリストのタスクを削除します。

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

最後に、新しいタスクを保存できます。

@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. 結論

この記事では、GroovyとSpring Bootを使用して単純なアプリケーションを構築しました。 また、それらを統合する方法を確認し、Groovyの優れた機能のいくつかを例を挙げて示しました。

いつものように、例の完全なソースコードは、GitHubから入手できます。