# 業務ロジック - PetController.initPetBinder() [5 LOC]

| 項目 | 値 |
|-------|-------|
| 完全修飾名 | `org.springframework.samples.petclinic.owner.PetController` |
| レイヤー | Controller |
| モジュール | `owner` (パッケージ: `org.springframework.samples.petclinic.owner`)

## 1. 役割

### PetController.initPetBinder()

`PetController.initPetBinder` メソッドは、Spring Web MVC がOwnersドメインにおけるペット（動物）情報の登録・更新画面をレンダリングする前に、リクエストボディのデータバインド（HTTPパラメータからJavaオブジェクトへの自動変換）をカスタマイズするための初期化メソッドです。

このメソッドはSpringの`@InitBinder`アノテーションによって登録され、モデル属性名 `"pet"` に該当するすべてのデータバインド操作に対して適用されます。具体的には、`PetValidator`バリデーターを`WebDataBinder`に設定することで、フォームから送信されたペット名や種類（種別）、生年月日などの入力値に対して業務ルールに準拠したバリデーションを実行可能にします。

加えて、`"id"` および `"*.id"` フィールドを禁止リスト（disallowed fields）に登録することで、悪意あるクライアントがHTTPリクエスト経由でペットの`id`フィールドを不正に書き換えることを防止します。これはデータ改ざん（Tainted Data）対策として重要なセキュリティハードニングであり、IDの外部からの指定によって存在しないリソースの取得や改ざんをブロックします。

本メソッドは大きなシステムにおけるデータ受取の「入り口」に位置し、Owner管理機能（Owners CRUD）の一部として、ペット情報の作成（Create）および更新（Update）フロー全体で共通して適用される基盤的な設定を行います。`@InitBinder`パターン（Dispatcherパターン）を採用しており、Spring MVCフレームワークによって自動的に呼び出されることで、コントローラー内の他のアクションメソッド（`initCreationForm`、`processCreationForm`、`processUpdateForm`など）に対して透過的に適用されます。

## 2. 処理パターン（詳細業務ロジック）

```mermaid
flowchart TD
    START(["initPetBinder dataBinder"])
    START --> S1["SET: PetValidator を生成"]
    S1 --> S2["EXEC: dataBinder.setValidator validator"]
    S2 --> S3["EXEC: dataBinder.setDisallowedFields 'id', '*.id'"]
    S3 --> END(["Return / 次処理へ"])
```

**処理概要:**

本メソッドには条件分岐（if / else / switch）は存在しません。処理は直線的に2ステップで構成され、すべて`WebDataBinder`オブジェクトの設定操作です。

1. **ステップ1:** 新しい`PetValidator`インスタンスを生成し、`Pet`フォーム入力値のバリデーションルールを準備する
2. **ステップ2:** `WebDataBinder`に対して生成した`PetValidator`を設定し、バインド後にバリデーションを実行するよう構成する
3. **ステップ3:** `WebDataBinder`の禁止リストに`"id"`と`"*.id"`を追加し、外部からのIDフィールドへの直接代入をブロックする

## 3. パラメータ分析

| No | パラメータ名 | 型 | 業務的説明 |
|----|---------------|------|---------------------|
| 1 | `dataBinder` | `WebDataBinder` | Spring MVCがHTTPリクエストパラメータを`Pet`モデルオブジェクトに変換（データバインド）する際に使用されるバインディングコンテナ。フォームからの入力値（ペット名、種別、生年月日など）を保持し、バリデーターの適用や禁止フィールドの設定を通じて、入力値の整合性とセキュリティを制御する役割を持つ |
| | | | |
| | **インスタンスフィールド（参照元）** | | |
| | なし | — | 本メソッドは`dataBinder`パラメータのみを使用し、コントローラーのインスタンスフィールドや外部状態に依存しない状態非依存（Stateless）な処理である |

## 4. CRUD操作／呼び出しサービス

本メソッドはデータベース操作や外部サービス呼び出しを行いません。`WebDataBinder`に対する設定のみを実行するため、CRUDカテゴリには該当しません。呼び出されるすべてのメソッドは`WebDataBinder`インスタンスメソッド（SET／EXEC）です。

| CRUD | SC / CBS | SCコード | エンティティ / DB | 操作の説明 |
|------|----------|---------|-------------|----------------------|
| — （該当なし） | `dataBinder.setValidator()` | — | — | バリデーターの登録。`PetValidator`をバインディングコンテナに設定し、後続のデータバインド後に自動バリデーションが実行されるよう構成する |
| — （該当なし） | `dataBinder.setDisallowedFields()` | — | — | 禁止フィールドの登録。`"id"`および`"*.id"`を禁止リストに追加し、HTTPリクエストからのIDフィールドへの不正代入をブロックするセキュリティ対策 |

## 5. 依存関係トレース

本メソッドはSpring MVCフレームワークによって自動的に呼び出される`@InitBinder`メソッドです。アプリケーションコードから直接呼び出す箇所はありません。フレームワーク内部（`ServletModelAttributeMethodProcessor` 等）から、`/owners/{ownerId}/pets/new`（GET）および`/owners/{ownerId}/pets/{petId}/edit`（GET/POST）エンドポイントにおけるペットデータバインドの準備段階で呼び出されます。

| # | 呼び出し元（画面/バッチ） | 呼び出しチェーン（本メソッドまでの全経路） | 終端（SC / CRUD / エンティティ） |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | Spring MVC DispatcherServlet | `DispatcherServlet → HandlerAdapter → InvocableHandlerMethod → @InitBinder("pet") → PetController.initPetBinder` | —（CRUD操作なし） |
| 2 | GET /owners/{ownerId}/pets/new | `initCreationForm → Spring MVCがdataBinder初期化時に本メソッドを自動呼び出し` | —（CRUD操作なし） |
| 3 | POST /owners/{ownerId}/pets/new | `processCreationForm(@Valid Pet pet, ...) → Spring MVCがバインド前に本メソッドを自動呼び出し → PetValidator.validate(pet, errors)` | —（CRUD操作なし） |
| 4 | GET /owners/{ownerId}/pets/{petId}/edit | `processUpdateForm(@Valid Pet pet, ...) → Spring MVCがバインド前に本メソッドを自動呼び出し → PetValidator.validate(pet, errors)` | `owners.findByOwner(Owner) [R] T_OWNER`<br>`types.findAll(PetType) [R] PET_TYPES` |
| 5 | POST /owners/{ownerId}/pets/{petId}/edit | `processUpdateForm(@Valid Pet pet, ...) → Spring MVCがバインド前に本メソッドを自動呼び出し → PetValidator.validate(pet, errors)` | `owners.findByOwner(Owner) [R] T_OWNER`<br>`types.findAll(PetType) [R] PET_TYPES` |

## 6. 分岐ごとの詳細ブロック

本メソッドには条件分岐（IF / ELSE / SWITCH）やループ処理（FOR / WHILE）は存在しません。処理は直線的に2ステップで構成されるため、2つのブロックとして記述します。

**Block 1** — [EXEC] `dataBinder.setValidator(new PetValidator())` (L95)

> `WebDataBinder`に対して`PetValidator`バリデーターを設定します。これにより、`Pet`モデルオブジェクトに対してバインド実行後にカスタムバリデーションが適用されるようになります。バリデーターは以下をチェックします:
> - ペット名の存在チェック（空文字列・空白のみの場合はエラー）
> - ペット種別の存在チェック（新規ペットの場合、種別がnullならエラー）
> - 生年月日が現在日以降でないことのチェック（エラー）

| # | 種別 | コード |
|---|------|------|
| 1 | SET | `new PetValidator()` // 新規バリデーターインスタンスを生成 |
| 2 | EXEC | `dataBinder.setValidator(new PetValidator())` // バリデーターをBinderに設定 |

**Block 2** — [EXEC] `dataBinder.setDisallowedFields("id", "*.id")` (L96)

> `WebDataBinder`の禁止フィールドリストに`"id"`および`"*.id"`を追加します。`"id"`は`Pet`オブジェクトの直接フィールドを、`"*.id"`はネストされたオブジェクトのIDフィールドをそれぞれ指します。これにより、HTTPリクエストパラメータ経由でID値が渡された際に、バインディングエラー（BindingResultへの記録）を発生させ、データ改ざんを防止します。

| # | 種別 | コード |
|---|------|------|
| 1 | EXEC | `dataBinder.setDisallowedFields("id", "*.id")` // IDフィールドの外部代入を禁止 |

## 7. 用語集

| 用語 | 種別 | 業務的意味 |
|------|------|------------------|
| `initPetBinder` | Method | ペットデータバインディング初期化 — Spring MVCのデータバインド設定をカスタマイズする`@InitBinder`メソッド |
| `WebDataBinder` | Type | データバインディングコンテナ — HTTPリクエストパラメータをJavaオブジェクトに変換・束縛するSpringのバインディングフレームワーククラス |
| `PetValidator` | Type | ペット入力値バリデーター — ペット名の必須チェック、種別の存在チェック、生年月日の妥当性チェックを実行するカスタムバリデーションクラス |
| `setValidator` | Method | バリデーター設定 — DataBinderにバリデーターを登録し、バインド後に自動バリデーションを実行するよう構成 |
| `setDisallowedFields` | Method | 禁止フィールド設定 — 外部からの代入を禁止するフィールド名をDataBinderに登録する |
| `"id"` | Constant | ペットIDフィールド — ペット一意識別子。外部からの直接代入を禁止してセキュリティを確保 |
| `"*.id"` | Constant | ネストIDフィールドパターン — 任意のネストレベルの`id`フィールドをワイルドカードで指定し、入れ子オブジェクトへのID代入もブロック |
| `@InitBinder` | Annotation | バインダー初期化アノテーション — Spring MVCがデータバインド準備時に呼び出すメソッドを宣言するためのアノテーション |
| `@Valid` | Annotation | バリデーショントリガー — JAX-BS/Bean ValidationおよびSpringのバリデーション連携アノテーション。引数につけることでバインド後にバリデーションを自動実行 |
| Owner | Entity | 飼い主エンティティ — ペットを所有する人物（Person）のドメインモデル |
| Pet | Entity | ペットエンティティ — 動物の个体情報を保持するドメインモデル |
| PetType | Entity | ペット種別エンティティ — ペットの分類（例: Cat, Dog）を保持するエンティティ |
| `VIEWS_PETS_CREATE_OR_UPDATE_FORM` | Constant | ペット登録・更新フォームビュー名 — `"pets/createOrUpdatePetForm"`（`PetController`内で静的定義） |
