crud-rest-controller について
crud-rest-controllerは、エンティティ向けのCRUD RESTコントローラーを生成するSpring Agent Toolkitのスキルです。Spring Dataリポジトリ、DTOマッピング、ページネーション、フィルタリング、patchに対応し、Amplicode IntelliJプラグインのSpring MCPを利用します。
主な機能
- 01標準的なCRUD RESTエンドポイント生成
- 02Spring Dataリポジトリ対応
- 03DTOマッピングとページネーションの選択
- 04フィルタリングとpatchに対応
- 05サンプルに基づくコード生成
活用シーン
- 01エンティティ用CRUD RESTコントローラーの生成
- 02一覧エンドポイントのページネーションやフィルター設定
- 03DTOによるエンティティのリクエストとレスポンス処理
MCP 対応
Amplicode IntelliJプラグインが提供するSpring MCPサーバーから、プロジェクト概要、依存関係、エンドポイント情報を取得します。MCPツールが使えない場合は、先にプラグインの導入と設定を求めます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ amplicode/ spring-skills --skill crud-rest-controllerインストール後、Claude Code で/crud-rest-controllerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
examples/_beans/injection/java.mdkotlin.mdexamples/_beans/repo-enhance/java.mdkotlin.mdexamples/_dependencies/dependencies.mdexamples/_methods/create/java.mdkotlin.mdexamples/_methods/delete-many/java.mdkotlin.mdexamples/_methods/delete/java.mdkotlin.mdexamples/_methods/get-list/java.mdkotlin.mdexamples/_methods/get-many/java.mdkotlin.mdexamples/_methods/get-one/java.mdkotlin.mdexamples/_methods/patch-many/java.mdkotlin.mdexamples/_methods/patch/java.mdkotlin.mdexamples/_skeletons/java.mdkotlin.md詳細
事前確認:Spring MCP
このスキルはSpring Agent Toolkitの一部であり、(Amplicode IntelliJ プラグインが提供する)Spring MCP serverと連携するように設計されています。ほかの作業を始める前に、ツール一覧にSpring MCPツールがあるか確認してください。これらのツールはamplicode MCPサーバーの下に公開されています(例:get_project_summary、list_module_dependencies、get_entity_details)。MCPツールをツール一覧にフラット化するハーネスでは、同じ名前のツールにmcp__amplicode__というプレフィックスが付きます。
- Amplicodeツールが1つ以上利用可能な場合 — MCPは接続されています。以下のスキルに進んでください。
- 利用可能なツールがない場合 — 作業を中止し、(Spring Agent Toolkitに同梱されている)**
amplicode-installスキルを実行してください。このスキルはAmplicodeプラグインをインストールし、ウェルカム画面の«Настроить Spring Agent»**ボタンのクリックとMCPクライアントの再起動をユーザーに案内します。完了するとMCPツールが利用可能になります。このスキルに戻って作業を再開してください。 - スキル一覧に
amplicode-installが登録されていない場合は、ユーザーの言語で次のように伝えてください。"このスキルにはAmplicode IntelliJプラグインとそのMCPサーバーが必要です。https://amplicode.ru/marketplace からIntelliJ IDEA Ultimate/CommunityまたはGigaIDEにインストールし、任意のプロジェクトを開いて、Amplicodeのウェルカム画面で«Настроить Spring Agent»をクリックしてから、MCPクライアントを再起動してください。"
CRUD RESTコントローラー
Spring Dataリポジトリを使用し、オプションのDTOマッピング、ページネーション、フィルタリング、パッチ対応を含む、エンティティ用の標準的なCRUDエンドポイントを備えた@RestControllerクラスを生成します。
重要:examples/ファイルのコードのみを使用してください。一致する例がない場合は、作業を中止してユーザーに確認してください。 重要:選択肢が決まっている質問では、
AskUserQuestionを優先し、次にその類似ツールを使い、最後にプレーンテキストのリストを使ってください。番号付きのプレーンテキストリストは、対話型ツールが利用できない場合の最終手段です。 重要:ステップ1を実行する前に、会話のコンテキストを確認してください。 ステップ2~4の質問の半分は、ユーザーのプロンプトやそれ以前のやり取りですでに回答されている可能性があります。すでに伝えられた内容を再度尋ねることが、このスキルが遅く感じられる最大の原因です。
デフォルト
以下のオプションはトピックごとに分類されています。languageとbootVersionは
自動検出されます。それ以外のオプションは、意思決定の原則(コンテキストから推定 → 確認 → 質問)に従って決定します。
ブロック1 — エンティティとリポジトリ
| オプション | デフォルト | 備考 |
|---|---|---|
| entity | -- | コントローラーを作成するエンティティ |
| repository | エンティティに対して最初に見つかったもの | 使用するリポジトリ |
ブロック2 — DTOモード
| オプション | デフォルト | 備考 |
|---|---|---|
| DTO mode | DTO(推奨) | エンティティ用の既存DTOがない場合は、dto-creatorに委任します。ユーザーはエンティティを直接使用することも選択できます |
ブロック3 — コントローラーの命名とパス
| オプション | デフォルト | 備考 |
|---|---|---|
| controllerName | {EntityName}Controller | プロジェクトの命名規則に基づいて提案します |
| controllerPackage | 既存のコントローラーと同じ、またはmainPackage | プロジェクトから自動検出されます |
| basePath | /rest | 永続的なベースパス |
| resourcePath | /{pluralizedEntityName} | エンティティ名から自動設定されます |
ブロック4 — ページネーションとフィルタリング
| オプション | デフォルト | 備考 |
|---|---|---|
| pagination | true | GET_LISTのページネーションを有効にします |
| paginationType | PAGE | PAGEまたはWINDOW(WINDOWを使用するにはフィルターの選択が必要です。件数取得クエリのオーバーヘッドを回避します) |
| filter | なし | GET_LIST用のJPA Specificationフィルター |
自動検出(質問なし)
| オプション | ソース |
|---|---|
| patchStrategy | ObjectMapper |
| language | get_project_summary |
| bootVersion | get_project_summary |
スマートなデフォルト設定: ユーザーが「デフォルトを使う」「すべてデフォルト」「デフォルト設定」などと言った場合、「常に質問する?」=NO の質問はすべて省略します。必須の質問のみ尋ねます。
スマートな回答の認識: ユーザーが番号付きリストから選ぶ代わりに値を提示した場合、その値をそのまま受け入れます。例:
- 質問「どのエンティティですか?」→ ユーザーの回答「Product」→ これがエンティティです。再度尋ねないでください
- 質問「リポジトリは?」→ ユーザーの回答「ProductRepository」→ これが選択内容です
- ユーザーが1つのメッセージで複数の回答を提示した場合 → すべて受け入れ、回答済みの質問は省略します
- ユーザーがすでに回答した質問(暗黙の回答も含む)は絶対に尋ねないでください
質問の一括提示: 複数の質問を尋ねる必要がある場合(つまり、意思決定の原則の1~2では解決できない場合)、次の条件を満たす質問は1回の AskUserQuestion 呼び出しにまとめます(1回につき最大4問)。
- 同じ論理的なセクションに属する
- 互いの回答に依存しない
ルール:
AskUserQuestionの呼び出し1回あたり、質問は最大3~4問- 推奨する選択肢には
(Recommended)を付け、最初に配置します - 異なる判断分岐の質問をまとめないでください
- 最初の分岐質問(エンティティの選択)は必ず単独で尋ねます
- 選択肢には
AskUserQuestionを優先し、ツールが利用できない場合にのみプレーンテキストのリストを使用します
意思決定の原則 — まずコンテキストを確認し、その後で質問する
ユーザーに何らかの質問をする前に、すでに収集したコンテキストから回答を導き出してください。プロジェクトの概要、モジュールの依存関係、エンティティの詳細、パッケージ内の既存ファイル、この会話の以前のやり取り、ユーザーの元のプロンプトが含まれます。コンテキストから明確なデフォルトを判断できない場合、または選択がユーザー固有のものである場合(例:どのエンティティ、どのリポジトリ)にのみ質問してください。
判断の優先順位:
-
コンテキストが明確 → 黙って決定し、質問しないでください。 例:
get_project_summaryから言語と JDK を取得する、エンティティに対応するリポジトリが1つだけの場合はそのリポジトリを使う、既存のコントローラーからコントローラーのパッケージを決める、既存のエンドポイントから basePath を決める、list_module_dependenciesから Jackson のバージョンを取得する、プロジェクトですでに一貫して使用されている場合はページネーションの種類を使う。 -
コンテキストから強い手がかりが得られる → 決定事項と代替案を1行で示し、ユーザーが変更するか、そのままにするかを任せます。 形式:
Will create `ProductController` at `/rest/products` with Page pagination, no DTO. Alternatives: use DTO, Window pagination, custom paths. OK?ユーザーが「OK」「はい」と答える、または無回答の場合 → そのまま受け入れます。代替案を指定した場合 → 切り替えます。これは番号付きの質問形式とは異なり、確認を求める1行のメッセージです。
-
コンテキストから明確なデフォルトを判断できない → 推奨する選択肢を最初に示して、
AskUserQuestion(推奨)またはそれに相当する方法で尋ねます。AskUserQuestionが利用可能な場合は、推奨する選択肢に(Recommended)を付け、最初に配置して使用します。対話形式の選択ツールが利用できない場合は、プレーンテキストのリストに切り替えます。 1回にまとめて質問できる場合に、「どのエンティティですか?」→ ユーザーが選ぶ →「リポジトリは?」→ …のように、絶対に1つずつ質問しないでください。 -
重要な入力についてコンテキストがまったくない → 率直に尋ねます。 これは、どのエンティティか(言及されていない場合)と、ユーザーが何を意図しているかに適用されます。
質問の方法 — AskUserQuestion を優先する
質問が必要な場合は、回答本文に番号付きリストを書くのではなく、
AskUserQuestion ツール(またはその類似ツール)を優先してください。対話形式の選択ツールが利用できない場合に限り、
通常のテキストで質問してください。
このスキルで AskUserQuestion を呼び出す際のルール:
- 1 回の呼び出しに、互いに独立した質問を最大 4 つ 含められます(ツールがまとめて表示します)。関連する決定を 1 回のやり取りでまとめるために活用してください。
- 各質問の選択肢は 2~4 個 です。自由記述用の「その他」はツールが自動で追加するため、手動で含めないでください。
- 推奨する選択肢は、ラベルの末尾に
(Recommended)を付けて 先頭に 配置してください。 headerは 12 文字のチップラベルです(例:「Entity」、「DTO mode」、「Paths」)。- 各選択肢には、その選択が何を意味するのかを説明する
descriptionを付けてください。
AskUserQuestion が適切なツール ではない 場合:
- 列挙可能な選択肢がない自由記述の入力(例:任意のクラス名、任意のパス) — 通常のテキストで質問してください。
- 原則 2 の「単一の確認文」形式 — 明確な「はい/いいえ」で答えられる通常の質問です。選択肢を列挙する必要はありません。
以下のステップ 2~4 にある、画面に応じた質問リストは、ケース 4 の フォールバック です。上から順に実行するためのスクリプトではありません。原則 1~3 によって質問への回答がすでに決まっている場合は、質問を省略してください。
ステップ 0 -- まず会話の文脈を確認(必須、ツール呼び出しなし)
MCP を呼び出す前、質問をする前に、ユーザーのプロンプトとこの会話のこれまでのやり取りを読み直し、すでに示されている内容を確認してください。このステップにはコストがかからず、このスキルで最もよくある失敗、つまりユーザーがすでに述べたことを尋ねてしまうのを防げます。
入力のチェックリストを頭の中で作り、ユーザーが明示的または暗黙的にすでに提示した内容をすべて確認します。
| 入力 | プロンプト/文脈で確認する内容 |
|---|---|
| エンティティ | クラス名(Product、Order、Vet)、「X 用」;IDE で開いているファイル;ファイルパス;この会話で最近話題になったエンティティ |
| リポジトリ | 「ProductRepository を使う」、「OrderRepo を使う」;または暗黙的に、対象エンティティのリポジトリが 1 つしかない場合 |
| DTO モード | 「DTO を使う」、「DTO を使わない」、「エンティティを直接使う」、「ProductDto にマッピングする」 |
| コントローラー名 | 「ProductResource という名前にする」、「クラス名を FooController にする」 |
| パス | 「/api/products にする」、「ベースパスを /rest にする」、「リソースパスを /items にする」 |
| ページネーション | 「ページネーションあり」、「ページネーションなし」、「Window を使う」、「Page を使う」 |
| フィルター | 「フィルターあり」、「フィルターなし」、「JPA Specification を使う」 |
| メソッド | 「CRUD 全部」、「読み取りのみ」、「読み取り専用」、「削除なし」、「GET + CREATE」、「完全な CRUD」 |
| スマートデフォルト | 「デフォルトを使う」、「すべてデフォルト」、「デフォルト設定」、「いつもどおり」 |
| 以前に確認したプロジェクト情報 | 言語、JDK、依存関係 — この会話ですでに話題になっている場合は把握済みです。再取得しないでください。 |
明示的に、または強く暗示されている形で回答済み の入力は、すべて決定済みとして扱い、ステップ 2~4 で該当する質問を省略してください。ユーザーが「Product の CRUD コントローラーを作成して」と書いている場合に「どのエンティティですか?」と尋ねてはいけません。Product が回答です。対象エンティティのリポジトリが 1 つしかない場合に「どのリポジトリですか?」と尋ねてはいけません。
未回答の入力については、上記の意思決定の原則に従ってください。まずプロジェクトの文脈から導き出し(ステップ 1)、その後で必要な場合にのみ質問してください。
ステップ 0 は頭の中で行うものであり、ツール呼び出しではありません。ユーザーに伝える必要はありません。「ステップ 0 完了」と書かないでください。ステップ 1 に進む前に、ユーザーがすでに述べた内容を把握しておいてください。
ステップ 1 -- プロジェクトの最小限のコンテキストを収集する(自動、質問なし)
後続のステップで結果が実際に使用されるMCP ツールのみを呼び出します。「必要になるかもしれない」からといって事前に取得しないでください。ここでの各変数には、具体的な後続の利用先が必要です。
| ツール | 変数 | 用途 |
|---|---|---|
get_project_summary | language、bootMajor、moduleName、buildFile、mainPackage | language → 参照ファイルの選択(java と kotlin);bootMajor → jakarta と javax、Jackson のバージョン;moduleName → マルチモジュールの識別;buildFile → ステップ 6 の依存関係の注入;mainPackage → コントローラーのパッケージのフォールバック |
list_module_dependencies(moduleName) | presentDeps | 以下の派生フラグ — SpringDoc/Validation/Jackson の機能ゲート、ステップ 6 の依存関係チェック |
list_project_endpoints | endpoints | ステップ 4 のパス競合検出、既存の basePath/命名規則の検出 |
これでステップ 1 は完了です。以下は取得しないでください。
list_all_domain_entities— ユーザーがプロンプトでエンティティを指定しなかった場合にのみ必要です。遅延フォールバックとしてステップ 2 に回します。list_entity_repositories— エンティティが分かってから必要になります。遅延フォールバックとしてステップ 3 に回します。get_entity_details— エンティティが分かってから必要になります。ステップ 2 に回します。list_entity_dtos/list_entity_mappers— エンティティと DTO の決定が済んでから必要になります。ステップ 4 に回します。
get_project_summary を呼び出した後、次を判断します。
language:Java または KotlinbootMajor:2、3、または 4(jakarta と javax、Jackson のバージョンに使用)presentDepsにorg.springdoc:springdoc-openapiが含まれているか確認します -->hasSpringDocpresentDepsにorg.hibernate.validator:hibernate-validatorまたはorg.springframework.boot:spring-boot-starter-validationが含まれているか確認します -->hasValidation- Jackson のバージョン検出:
presentDepsでtools.jackson:jackson-databindまたはtools.jackson:jackson-coreを確認します -->jacksonMajor = 3。それ以外の場合、com.fasterxml.jackson:jackson-databindが含まれていれば -->jacksonMajor = 2。Spring Boot 4.x は Jackson 3.x(tools.jacksonパッケージ)、Spring Boot 2.x/3.x は Jackson 2.x(com.fasterxml.jacksonパッケージ)を使用します。jacksonMajor = 3の場合:JsonNodeFqn=tools.jackson.databind.JsonNode、ObjectMapperFqn=tools.jackson.databind.ObjectMapperjacksonMajor = 2の場合:JsonNodeFqn=com.fasterxml.jackson.databind.JsonNode、ObjectMapperFqn=com.fasterxml.jackson.databind.ObjectMapper
- PagedModel の検出:
PagedModel(org.springframework.data.web.PagedModel)は Spring Data 3.2 以降で利用できます。bootMajor >= 3(Spring Boot 3.2 以降)またはbootMajor = 4の場合、Page ページネーションを使用する GET_LIST にはPagedModelラッパーを使用します。それ以外の場合はPage<Entity>を直接返します。
マルチモジュールプロジェクト(get_project_summary に複数のモジュールがある場合)の場合:
使用するモジュールを尋ねます。その後、そのモジュールを指定してモジュール固有の MCP ツールを再度呼び出します。
ステップ 2 -- エンティティを選択する
ステップ 0 の時点で、ユーザーがエンティティに言及していれば、すでに把握しているはずです。
最も一般的なケース:ユーザーが「Product の CRUD コントローラーを作成して」と入力した場合 →
エンティティは Product です。質問は省略し、以下の取得処理に進みます。
遅延フォールバック — エンティティが不明な場合のみ:
list_all_domain_entities(moduleName) → entities を呼び出し、その後
AskUserQuestion で質問します(選択肢 = リスト内のエンティティ名、最大 4 件。エンティティが
4 件を超える場合は、コンテキストに基づいて可能性の高い候補を 4 件選び、
「Other」から別の名前を入力できることを注記します)。
list_all_domain_entities を呼び出すのはここだけです。
ユーザーがプロンプトでエンティティ名を指定した場合は、呼び出さないでください。
エンティティの FQN が分かったら、get_entity_details(entityFqn) を呼び出して、以下を取得します。
IdType-- エンティティ ID フィールドの型(例:java.lang.Long、java.util.UUID)entityVar-- エンティティ名の先頭を小文字にしたもの(例:product)entityVarPlural-- エンティティ名の先頭を小文字にした複数形(例:products)EntityName-- 単純クラス名(例:Product)EntityNamePlural-- 単純クラス名の複数形(例:Products)- エンティティにバリデーションアノテーションがあるかどうか -->
entityHasValidation
ステップ 3 -- リポジトリを選択する
ステップ 0 の時点で、ユーザーがリポジトリに言及していれば、すでに把握している場合があります。
list_entity_repositories(entityFqn) → repos を呼び出します。その後、以下の
判断原則を適用します。
- リポジトリが 1 つだけの場合 → 何も尋ねずに選択します(原則 1)。
- ユーザーが特定のリポジトリを指定した場合 → それを直接使用し、質問は省略します。
- リポジトリが複数ある場合 →
reposの選択肢を使ってAskUserQuestionで質問します。 - リポジトリがない場合 → ユーザーに伝え、手動で作成するか、別のスキルを使用することを提案します。
選択後:
repoFieldName-- リポジトリクラス名の先頭を小文字にしたもの(例:productRepository)RepoFqn-- リポジトリクラスの FQN
ステップ 4 -- DTO とカスタマイズに関する質問
ステップ 0 の時点で、ユーザーが DTO モードに言及していれば、すでに把握している場合があります (例:「DTO を使用」「DTO を使用しない」「エンティティを直接使用」「ProductDto にマッピング」)。 その場合は質問を省略して進みます。
不明な場合は、AskUserQuestion で質問します。
| 質問 | ヘッダー | 選択肢(最初の選択肢が推奨) |
|---|---|---|
| マッピングに DTO を使用しますか? | DTO モード | はい、DTO を使用(推奨):既存のものを選択するか、dto-creator を使って新規作成する / いいえ、エンティティを直接使用する |
DTO を選択した場合:
list_entity_dtos(entityFqn) と list_entity_mappers(entityFqn) を呼び出します。
既存の DTO とマッパーが見つかった場合: ユーザーに選択してもらいます。以下を取得します。
DtoFqn-- DTO クラスの FQNdtoVar-- DTO 名の先頭を小文字にしたものmapperFieldName-- マッパークラス名の先頭を小文字にしたものtoDtoMethodName-- エンティティから DTO へのマッパーメソッド(例:toDto)toEntityMethodName-- DTO からエンティティへのマッパーメソッド(例:toEntity)updateMethodName-- 更新用のマッパーメソッド(例:updateWithNullValues)
警告:CREATE と PATCH の操作には、マッパーに toEntity メソッドと updateWithNull メソッドが必要です。
エンティティ用の DTO が存在しない場合: dto-creator に委任して
作成します。dto-creator スキルが DTO の生成を処理し、
(REST コントローラー用の DTO であるため、変換は不可欠なので)マッパーの作成を
mapper-creator に自動的に委任します。両方の作成後、ここに戻り、ステップ 4 のパス設定に進みます。
DTO は存在するがマッパーがない場合: mapper-creator に委任して作成
します。マッパーの作成後、ここに戻って続行します。
パス、ページネーション、フィルターの設定
意思決定の原則を適用します。これらの設定は、ほとんどの場合、コンテキストから適切なデフォルト値を導き出せます。ユーザーが明示的にカスタマイズを求めていない限り、原則 2(一行で確認)を使用してください。
Will create `{EntityName}Controller` in `{controllerPackage}` at `{basePath}/{entityVarPlural}`, Page pagination, no filter. OK?
ユーザーは「ok」/「yes」と答える、または何も答えないことで、すべてのデフォルト値を受け入れられます。また、特定の値を変更した場合は、その変更のみを適用します。
ユーザーが細かな制御を明示的に求めた場合(「カスタムパス」、「ページネーションを設定」など)、またはコンテキストから明確なデフォルト値を導き出せない場合にのみ、個別の質問を行います。
ユーザーがフィルターを選択した場合:既存のフィルタークラスを選択するよう尋ねます。FilterFqn と toSpecificationMethodName を抽出します。リポジトリが JpaSpecificationExecutor を継承していない場合は、追加します(WA-repo-enhance)。
メソッドの選択
Step 0 の時点で、ユーザーが希望するメソッド(例:「読み取り専用」、「GET と CREATE のみ」、「完全な CRUD」)がすでにわかっている場合があります。その場合は質問を省略します。
不明な場合は、AskUserQuestion を使って尋ねます。
| 質問 | ヘッダー | 選択肢(最初の項目が推奨) |
|---|---|---|
| どの CRUD メソッドを生成しますか? | メソッド | 完全な CRUD(推奨):GET_LIST、GET_ONE、GET_MANY、CREATE、PATCH、PATCH_MANY、DELETE、DELETE_MANY / 標準的な CRUD:GET_LIST、GET_ONE、CREATE、PATCH、DELETE / 読み取り専用:GET_LIST、GET_ONE / カスタム:個別のメソッドを選択 |
選択したメソッドのセットを selectedMethods として保存します。Step 5.3 では、これらのメソッドのみを生成し、それ以外は省略します。
Step 5 -- コードを生成する
5.1 コントローラークラスを作成する(WA1)
language に応じて examples/_skeletons/java.md または examples/_skeletons/kotlin.md を読み込みます。
変数を置換します。
{packageName}--> controllerPackage{className}--> controllerName{requestPath}--> basePath + resourcePath
Write ツールを使って src/main/{java,kotlin}/{package-path}/{controllerName}.{java,kt} を作成します。
5.2 Bean の注入を追加する(WA2)
examples/_beans/injection/java.md または kotlin.md を読み込みます。
リポジトリのコンストラクターパラメーターを追加します。DTO とマッパーを使う場合は、マッパー Bean も注入します。
${ObjectMapperFqn} フィールドを注入します(Step 1 で解決済み:Jackson 3.x の場合は tools.jackson.databind.ObjectMapper、Jackson 2.x の場合は com.fasterxml.jackson.databind.ObjectMapper)。
Edit ツールを使ってコントローラークラスを変更します。
5.3 CRUD メソッドを追加する(WA3-WA11)
selectedMethods(Step 4 のメソッド選択で指定)にある各メソッドについて、次の手順を行います。
-
例のファイルパスを決定します。
examples/_methods/{method-name}/{language}.md -
例のファイルを読み込みます。
-
次の条件に基づいて、適切なコードバリアントを選択します。
- DTO モード(DTO なし/DTO あり)
- GET_LIST の場合:ページネーション(PAGE/WINDOW/なし)とフィルター(あり/なし)
- PATCH/PATCH_MANY の場合:ObjectMapper または ObjectPatcher、および DTO の有無(4 通り)
- CREATE の場合:@Valid の有無
-
変数を置換します(Variables セクションで宣言された変数のみ)。
-
FQN の処理(重要): 例には FQN(例:
org.springframework.web.bind.annotation.GetMapping、org.springframework.data.domain.Pageable、エンティティ/DTO/リポジトリの FQN)が含まれます。 最終ファイルを書き込むときは、必ず次の処理を行います。- 本文内のすべての FQN を短縮名に置き換えます。
- 短縮したすべての FQN を集め、対応する
import行をpackage文の直後に追加します。並べ替え、重複は除外します。 - コントローラーと同じパッケージのクラスはインポートしてはいけません。
java.langの型はインポートしてはいけません。- Kotlin も同じルールに従い、本文内の FQN を短縮し、先頭に
import行を追加します。
-
Edit ツールを使って、コントローラークラスの本体にメソッドを挿入します。
5.4 必要に応じて JpaSpecificationExecutor を追加する(WA-repo-enhance)
フィルターが選択されていて、リポジトリがすでに JpaSpecificationExecutor を継承していない場合:
examples/_beans/repo-enhance/java.md または kotlin.md を読み込みます。
Edit ツールを使って、リポジトリの extends リストに org.springframework.data.jpa.repository.JpaSpecificationExecutor<{EntityFqn}> を追加します。
ステップ 6 -- 依存関係とプロパティ(自動)
examples/_dependencies/dependencies.mdを読みますpresentDepsにない各成果物について:- ステップ 1 の
buildFileを使用します - ビルドファイルを編集して依存関係を追加します
- ステップ 1 の
refresh_build_system_modelを呼び出します- このスキルではプロパティは書き込みません(コントローラーには
application.propertiesの項目がありません) - 次のように報告します:「CRUD エンドポイントを備えたコントローラー {controllerName} を作成しました。追加した依存関係:[リスト]。」
ハルシネーション防止チェックリスト
コードを書く前に、次の項目を確認します。
- コードが examples/ ファイルから取得されている(どのファイルかを明記)
- 置き換えたのは宣言された変数のみ
- 「知識に基づいて」フレームワーク API 呼び出しを追加していない
- インポートリストに、本文で短縮したすべての FQN が含まれている(不足や余分なインポートがない)
- メソッドシグネチャが例と完全に一致している
- コメントや便利メソッドを追加していない
- 例にある FQN を本文で短縮し、対応する
import行をpackageの後に追加している(IDE では自動追加されません) -
@ParameterObjectアノテーションは、hasSpringDoc = trueの場合にのみ追加している -
@Validアノテーションは、hasValidation = trueかつエンティティにバリデーションアノテーションがある場合にのみ追加している - PATCH および PATCH_MANY メソッドでは、プロジェクトの依存関係に応じて ObjectMapper(フォールバック)または ObjectPatcher を使用している
- PATCH_MANY の
getId()が、エンティティの実際の ID アクセサーと一致している - Jackson 3.x(Spring Boot 4.x)では Jackson の FQN に
tools.jackson.databind.*を使用し、Jackson 2.x(Spring Boot 2.x/3.x)ではcom.fasterxml.jackson.databind.*を使用している。どちらか一方を決め打ちしてはいけません。必ずステップ 1 で${JsonNodeFqn}と${ObjectMapperFqn}を解決してください。 - Page ページネーションを使用する GET_LIST では、
PagedModel<Entity>ラッパー(Spring Data 3.2+ / Boot 3.2+/4.x)を使用するか、Page<Entity>を直接返すか(古いバージョン)を確認している。適切な例のバリエーションを選択してください。