1. 概要

このチュートリアルでは、Spring Bootを使用してJSONコンテンツを消費および生成するRESTサービスを構築する方法を示します。

また、RESTfulHTTPセマンティクスを簡単に使用する方法についても見ていきます。

簡単にするために、永続層は含めませんが、Spring Dataを使用するとこれを簡単に追加できます。

2. RESTサービス

Spring BootでJSONRESTサービスを作成するのは簡単です。これは、Jacksonがクラスパス上にある場合のデフォルトの意見です。

@RestController
@RequestMapping("/students")
public class StudentController {

    @Autowired
    private StudentService service;

    @GetMapping("/{id}")
    public Student read(@PathVariable String id) {
        return service.find(id);
    }

...

StudentController@RestControllerのアノテーションを付けることで、はSpring Bootに読み取りメソッドの戻り型を応答本文に書き込むように指示しました。 クラスレベルで@RequestMappingもあるので、追加する他のパブリックメソッドでも同じになります。

単純ですが、このアプローチにはHTTPセマンティクスがありません。たとえば、要求された学生が見つからない場合はどうなりますか? 200または500のステータスコードを返す代わりに、404を返したい場合があります。

HTTP応答自体をより細かく制御する方法を見てみましょう。次に、コントローラーにいくつかの典型的なRESTful動作を追加します。

3. 作成

ステータスコードなど、本文以外の応答の側面を制御する必要がある場合は、代わりにResponseEntityを返すことができます。

@PostMapping("/")
public ResponseEntity<Student> create(@RequestBody Student student) 
    throws URISyntaxException {
    Student createdStudent = service.create(student);
    if (createdStudent == null) {
        return ResponseEntity.notFound().build();
    } else {
        URI uri = ServletUriComponentsBuilder.fromCurrentRequest()
          .path("/{id}")
          .buildAndExpand(createdStudent.getId())
          .toUri();

        return ResponseEntity.created(uri)
          .body(createdStudent);
    }
}

ここでは、作成されたStudentを応答で返すだけではありません。 セマンティックにクリアなHTTPステータスで応答し、作成が成功した場合は、新しいリソースへのURIを返します。

4. 読んだ

前述のように、単一の Student を読みたい場合、学生が見つからない場合は404を返す方が意味的に明確です。

@GetMapping("/{id}")
public ResponseEntity<Student> read(@PathVariable("id") Long id) {
    Student foundStudent = service.read(id);
    if (foundStudent == null) {
        return ResponseEntity.notFound().build();
    } else {
        return ResponseEntity.ok(foundStudent);
    }
}

ここでは、最初の read()実装との違いを明確に確認できます。

このようにして、 Student オブジェクトは応答本文に適切にマッピングされ、同時に適切なステータスで返されます。

5. アップデート

更新は作成と非常に似ていますが、POSTではなくPUTにマップされ、URIに更新するリソースのidが含まれている点が異なります。

@PutMapping("/{id}")
public ResponseEntity<Student> update(@RequestBody Student student, @PathVariable Long id) {
    Student updatedStudent = service.update(id, student);
    if (updatedStudent == null) {
        return ResponseEntity.notFound().build();
    } else {
        return ResponseEntity.ok(updatedStudent);
    }
}

6. 消去

削除操作はDELETEメソッドにマップされます。 URIには、リソースのidも含まれています。

@DeleteMapping("/{id}")
public ResponseEntity<Object> deleteStudent(@PathVariable Long id) {
    service.delete(id);
    return ResponseEntity.noContent().build();
}

delete()メソッドは実際には例外をスローして失敗するため、特定のエラー処理を実装しませんでした。

7. 結論

この記事では、Spring Bootで開発された典型的なCRUDRESTサービスでJSONコンテンツを消費および生成する方法を学びました。 さらに、適切な応答ステータス制御とエラー処理を実装する方法を示しました。

簡単にするために、今回は永続化については説明しませんでしたが、 Spring Data REST は、RESTfulデータサービスを構築するための迅速かつ効率的な方法を提供します。

この例の完全なソースコードは、GitHubから入手できます。