導入
レッスン12で「メソッドがオブジェクトを返すと、そのままJSONになる」と説明しました。文字通り「そのまま」で本当に大丈夫なのでしょうか。裏側で何が起きているのかを見ておきましょう。
説明
@RestController のメソッドがJavaオブジェクトを返すと、Springは内部で Jackson というライブラリを使い、オブジェクトのフィールドをJSONのキーと値に変換します。
class User {
private Long id;
private String name;
private String email;
// コンストラクタ・getterは省略
}
@GetMapping("/{id}")
public User get(@PathVariable Long id) {
return userService.findById(id); // User オブジェクトを返すだけ
}
// 実際にクライアントへ返るレスポンス
{
"id": 5,
"name": "山田太郎",
"email": "yamada@example.com"
}
この変換を行っているのが HttpMessageConverter という仕組みです。spring-boot-starter-web にはJacksonがあらかじめ組み込まれているため、開発者は変換処理を一切書かずに済みます。
sequenceDiagram
participant Client as クライアント
participant Ctrl as Controller
participant Jackson as Jackson(JSON変換)
Client->>Ctrl: GET /api/users/5
Ctrl->>Ctrl: User オブジェクトを組み立てる
Ctrl-->>Jackson: User オブジェクトを渡す
Jackson-->>Client: JSON文字列に変換して返す
逆方向(クライアントが送ったJSONをJavaオブジェクトに変換する)も同じ仕組みで行われます。これは次のレッスンで扱う @RequestBody の役割です。「JavaオブジェクトとJSONの変換は、意識しなくても勝手に行われている」——このことを知っておくだけで、Springのコード中に見当たらない変換処理を探して迷うことがなくなります。
やってみよう
User クラスに password フィールドを足したとします。このままではAPIのレスポンスに password の値までJSONとして含まれてしまいます。この問題をどう防げばよさそうか考えてみましょう(次のレッスンの「DTOを分ける」という発想のヒントになります)。