Apache Causeway(コーズウェイ)は、Javaで書いたドメインクラスから、業務用のWeb画面とREST API、GraphQL APIを実行時に組み立てるオープンソースのフレームワークです。2023年まではApache Isisという名前でした。画面やコントローラを書かずに、エンティティとそのメソッドだけで業務アプリが動く点が最大の特徴です。
この記事では、2026年11月時点の版の系統(安定版3.6.0と開発中の4.0)、選ぶ前に確認すべき脆弱性、公式のhelloworldアプリを実際にビルドして起動した手順、入力チェックや操作制限の書き方を、公式ドキュメントとMaven Centralの記録に沿って説明します。
まとめ:Apache Causewayの要点と選ぶべき版
- 何をするものか:Naked Objectsパターンの実装です。エンティティのプロパティとメソッドを読み取り、Wicketベースの画面・Restful Objects仕様のREST API・GraphQL APIの3種類を自動で公開します。
- どの版を使うか:本番で使える最新の安定版は3.6.0(2026年4月9日リリース)で、Spring Boot 3.5.13とJava 17以上が前提です。4.0.0-M2(2026年6月12日)はSpring Boot 4ベースのマイルストーン版です。
- 脆弱性:CVE-2025-64408(ビューモデルのURLパラメータ経由のデシリアライズでリモートコード実行)は2.0.0〜3.4.0と4.0.0-M1が影響を受けます。3系は3.5.0で修正済みで、2系に修正版は出ていません。
- 試し方:公式のhelloworldを取得して
mvn clean installとmvn spring-boot:runで起動し、ユーザー名 sven/パスワード pass でログインします。 - 向く案件:ドメインのルールが多く、画面の見た目より正確さが重要な社内業務アプリやバックオフィスです。一般消費者向けにUIを作り込む用途には向きません。
Apache Causewayの位置づけ:Naked Objectsパターンと旧Apache Isis
ドメインクラスから画面とAPIが生成される仕組み
Causewayは、Richard Pawsonが提唱したNaked Objectsパターンを実装しています。このパターンでは、業務の概念をそのままオブジェクトとして画面に出し、利用者はオブジェクトのプロパティを読み、メソッド(アクション)を呼び出して操作します。開発者がコントローラや画面テンプレートを書く代わりに、フレームワークが起動時にクラスを走査してメタモデルを組み立て、そのメタモデルから画面とAPIを描画します。
メタモデルの材料はアノテーションと命名規則です。@DomainObject がエンティティやビューモデル、@Action が呼び出せる操作、@Property と @Collection がプロパティとコレクション、@DomainService がメニューに出すサービスを表します。ドメイン層の設計そのもの(DDDの層の切り方)はDDDの実装手順:値オブジェクトから集約まで既存コードを段階移行するTypeScript実例で整理しています。
Apache Isisから改称するまでの経緯
元のコードはRobert Matthewsが開発したNaked Objects Framework for Javaで、Apache Isisとして2012年10月にApacheのトップレベルプロジェクトになりました。Apacheのプロジェクト台帳では、Isisは2023年1月に退役扱いとなり、同じ委員会がApache Causewayとして続いています。リリース上の改称は2023年3月25日の2.0.0-RC1で、MavenのグループIDとJavaのパッケージ名も org.apache.isis から org.apache.causeway に変わりました(Isis名義の最終版は2.0.0-M9)。
そのため、ネット上の古い解説やStack Overflowの回答は「Isis」名義のものが多く、設定キーも isis. で始まります。Causewayで動かすときは causeway. に読み替えてください。
バージョン系統の違い:v2・v3・v4の要件と選び方
Causewayは同時期に複数の系統を出してきました。2024年4月3日に2.0.0と3.0.0が正式リリースされ、2系はjavax、3系はjakarta名前空間という違いで並行保守されました。2系の最終リリースは2024年7月の2.1.0です。その後は3系の安定版に加え、4系のマイルストーン版もリリースされています。
| 系統 | 最新版(リリース日) | Spring Boot | Java | 永続化 | 状態 |
|---|---|---|---|---|---|
| v2 | 2.1.0(2024年7月) | 2.7.18 | 11以上 | JPA・JDO | 更新停止 |
| v3 | 3.6.0(2026-04-09) | 3.5.13 | 17以上 | JPA・JDO | 安定版 |
| v4 | 4.0.0-M2(2026-06-12) | 4.0.5 | 17以上 | JPAのみ | マイルストーン |
Spring BootとJavaの版は、Maven Centralに公開された causeway-bom の pom で確認した値です。2026年11月6日にMaven Centralの版一覧を見直した時点でも、正式版の最新は3.6.0、全体の最新は4.0.0-M2のままでした。v3の公式スターターアプリは、Causeway本体の要件(Java 17)より上のJava 21でビルドする設定になっています。3.6.0はEclipseLink 4.0.9、DataNucleus 6.0.5、Apache Wicket 10.8.0を同梱しています。Spring Boot 4への移行の全体像はSpring Boot 4とは?最新バージョン4.1の変更点・新機能とSpring Boot 3との違い【2026年10月】で扱っています。
CVE-2025-64408の影響範囲と版の選び方
2025年11月19日に公開されたCVE-2025-64408は、ビューモデル機能が受け取るURLパラメータを細工すると、Javaのデシリアライズを経由してリモートでコードを実行できるという脆弱性です。攻撃者はログイン済みである必要がありますが、成功するとアプリの権限で任意のコードが動きます。深刻度はApacheの評価で「critical」です。CVEの記録では影響版は2.0.0〜3.4.0と4.0.0-M1で、公式の対処は3.5.0への更新です(4.0.0-M2は影響版の一覧に含まれていません)。
2系の最終版2.1.0も影響範囲に入っており、修正版はありません。社内ツールでも認証済み利用者による攻撃を想定する必要があります。2系で動いているアプリには、修正済みの安定版3.6.0への移行を推奨します。2系から3系への移行は、javaxからjakartaへの置換とSpring Boot 2.7から3.xへの更新を同時に行う作業になります。
4.0マイルストーン版の本番採用リスク
4.0.0-M1の移行ノートには、JDOサポートの削除、RestEasyの削除(Spring標準のREST機能へ置き換え)、Joda-Timeの値型サポートの削除、ログAPIのLog4jからSLF4Jへの変更、Jackson 3とJUnit 6への更新が並んでいます。M2ではさらにプロパティのclearメソッド(clearUsername() など)のサポートが削除されました。
| 項目 | v3(3.6.0) | v4(4.0.0-M2) |
|---|---|---|
| REST APIのMaven成果物 | causeway-viewer-restfulobjects-jaxrsresteasy | causeway-viewer-restfulobjects-viewer |
| REST APIのパス設定 | resteasy.jaxrs.defaultPath | causeway.viewer.restfulobjects.basePath |
| CausewayConfigurationの取得 | getXxx() | xxx()(record化) |
| JDO(DataNucleus) | 使える | 削除 |
マイルストーン版の間はAPIが変わり続けており、移行ノートにも「4.0.0までに手直しが入る可能性がある」と書かれた試作APIが含まれています。本番運用を予定する新規開発では、正式版の4.0.0が出るまでは3.6.0で始め、永続化にはJPAを推奨します。4.0系で削除されるJDOへの依存を避け、将来の移行で永続化方式を変更する作業を減らせるためです。
helloworldスターターの起動手順と実測結果
公式は2つのスターターアプリを用意しています。helloworldはエンティティ1つ・Mavenモジュール1つの最小構成で、simpleappはドメインとWebアプリのモジュールを分け、単体テストと結合テストの例を含みます。公式は、自分のアプリの土台にはsimpleappを使うよう勧めています。ここでは仕組みを確かめるためにhelloworldを使います。
latest版helloworld手順のv4-jpa指定と安定版向けv3-jpaの選択
2026年11月時点で、公式サイトの「latest」のドキュメントは4.0.0-M2版になっており、helloworldの手順も4.0系の v4-jpa ブランチを取得するコマンドが既定です。そのままコピーするとマイルストーン版で始めることになるので、本番を見据えて試すなら3.6.0の v3-jpa を指定します。一方、公式トップのQuick StartはDockerで動かす方法と、VER="3-jpa" を例示したビルド手順を載せており、ページによって既定の版が違います。3.6.0向けの手順は版を固定したドキュメントで読めます。どちらのブランチも pom.xml の java.version は21です。
v3-jpaのビルドと起動
2026年10月6日に、3.6.0版のhelloworld(JPA版)をTemurin 25.0.4.1とMaven 3.9.11で動かしました。前提はJava 21以上です。Mavenの下限は資料で異なり、3.6.0版のドキュメントは3.9.7以上、v3-jpaブランチのREADMEは3.9.11以上としているので、実測と同じ3.9.11以上を使うのが確実です。
curl https://codeload.github.com/apache/causeway-app-helloworld/zip/v3-jpa | jar xv
cd causeway-app-helloworld-3-jpa
mvn clean install
mvn spring-boot:run
初回は依存ライブラリの取得があるため、ビルドに数分以上かかります。この実測では、ビルドで生成された target/helloworld-jpa-3.6.0-exec.jar を java -jar で起動し、ログに Started HelloWorldApp in 16.676 seconds と出ました。Java 25ではEclipseLinkが「Java SE ’25’ is not fully supported yet」と警告を出しましたが、起動と操作には支障ありませんでした。警告を避けたい場合はJava 21で動かしてください。
起動後に http://localhost:8080 を開くと、入口ページから次の3種類のビューアとSwagger UIにアクセスできます。
- wicket/:自動生成された業務画面。ユーザー名 sven、パスワード pass でログインします
- restful/:Restful Objects仕様のREST API。Swagger UIも入口ページから開けます
- graphiql:GraphQL APIを試すGraphiQL画面
データベースはH2のインメモリなので、再起動するとデータは消えます。ユーザーはコード内の SimpleRealm で定義されており、本番ではSecManやSpring Securityの認証に差し替える前提です。IntelliJ IDEAで開く場合は、リポジトリの .run/HelloWorldApp.run.xml が実行構成として読み込まれ、HelloWorldApp をそのまま起動できます。
helloworldのファイル構成と各クラスの役割
v3-jpaブランチのJavaソースは、モジュール側の domainapp/modules/hello と、起動側の domainapp/webapp に分かれています。自分のエンティティを足すときに触るファイルは次のとおりです。
| ファイル | 役割 |
|---|---|
| HelloWorldObject.java | エンティティ本体(@Entity+@DomainObject) |
| HelloWorldObjects.java | メニューに出るドメインサービス |
| HelloWorldRepository.java | Spring Data JPAのリポジトリ |
| types/Name.java・Notes.java | 最大長などを束ねたメタアノテーション |
| HelloWorldObject.layout.xml | 詳細画面の配置 |
| HelloWorldModule.java | モジュールのスキャン範囲 |
| AppManifest.java | 使うフレームワーク部品の選択 |
| menubars.layout.xml | メニューバーの並び |
| application.yml | causeway.* の設定値 |
HelloWorldObjects は @DomainService と @Named("hello.HelloWorldObjects") を付けたクラスで、create・findByName・listAll の3つのアクションがメニュー項目になります。listAll は restrictTo = RestrictTo.PROTOTYPING 付きなので、本番モードでは表示されません。types/Name.java は @Property(maxLength = 40) と @Parameter(maxLength = 40) をまとめた独自アノテーションで、引数やプロパティに @Name と書くだけで入力の上限が40文字になります。同じ型の制約をクラスごとに書き直さないための仕組みです。
AppManifest の @Import には、セキュリティ(CausewayModuleSecuritySimple)、永続化(CausewayModulePersistenceJpaEclipselink)、REST API(CausewayModuleViewerRestfulObjectsJaxrsResteasy)、GraphQL、Wicket、H2コンソールといった部品と、アプリ側の HelloWorldModule が並びます。セキュリティの実装は必ず1つだけ選ぶ決まりです。4.0系では、このREST APIの部品がRestEasyを使わない CausewayModuleViewerRestfulObjectsViewer に置き換わります。
ドメインクラスの書き方:アクションと検証・操作制限
エンティティとアクションの宣言
helloworldのエンティティ HelloWorldObject は、JPAの @Entity に加えて @DomainObject と @Named("hello.HelloWorldObject") を付けた普通のクラスです。@Named の値はREST APIのURLにも使われる論理名になります。JPAエンティティそのものの書き方はエンティティクラスとは?JPAとEF Coreの書き方・DTOとの違いを実行結果で解説と同じです。
アクションには @Action(semantics = ...) で副作用の種類を宣言します。SAFE(参照のみ)、IDEMPOTENT(何度呼んでも結果が同じ更新)、NON_IDEMPOTENT(繰り返し呼ぶと状態がさらに変わり得る操作)が基本の分類で、REST APIではそれぞれGET・PUT・POSTに対応します。ほかに、リクエスト内キャッシュや実行前の確認ダイアログを指定する派生値もあります。helloworldの設定ファイルは causeway.applib.annotation.action.explicit: true になっているので、@Action を付けていないpublicメソッドは画面に出ません。
validate・disable・defaultのサポートメソッド
入力チェックや操作の可否は、アクション名に接頭辞を付けたメソッドで書きます。次の updateNotes はhelloworldのエンティティに追加して動かしたコードです。
@Action(semantics = SemanticsOf.IDEMPOTENT)
@ActionLayout(associateWith = "notes")
public HelloWorldObject updateNotes(@Notes final String notes) {
setNotes(notes);
return this;
}
// ダイアログを開いたときの初期値(0番目の引数)
public String default0UpdateNotes() {
return getNotes();
}
// 0番目の引数の検証。null以外を返すとエラー
public String validate0UpdateNotes(final String notes) {
return notes != null && notes.length() > 20 ? "メモは20文字以内です" : null;
}
// アクション自体を無効にする条件
public String disableUpdateNotes() {
return getName().startsWith("LOCKED") ? "ロック中のため変更できません" : null;
}
validate0UpdateNotes() と disableUpdateNotes() は、戻り値が null なら許可し、文字列ならその理由を表示して拒否します。default0UpdateNotes() の戻り値は入力欄の初期値です。ほかに、条件によって画面から隠す hideXxx()、選択肢を出す choices0Xxx() も同じ命名規則です。この例の文字数は String.length() が返すUTF-16のコード単位数なので、絵文字のように1文字で2単位になる文字は少ない文字数で上限に達します。ここで書いたルールは画面だけでなくREST APIとGraphQL APIにも同じように効くので、入口ごとに検証を重複して書く必要がありません。
REST APIで検証ルールが効くことの確認
上のアクションをREST APIから呼ぶと、画面と同じ判定が返りました。再現する場合は、コード追加後にアプリを再ビルド・再起動します。まず次のPOSTでAlphaを作り、続けてnameの値をLOCKED-2、Betaに変えて同じPOSTを実行してください。以降のURLにあるIDは、実際の応答のinstanceIdに合わせます。
curl -u sven:pass -X POST \
-H "Accept: application/json" -H "Content-Type: application/json" \
-d '{"name":{"value":"Alpha"}}' \
http://localhost:8080/restful/services/hello.HelloWorldObjects/actions/create/invoke
応答は200で、タイトル「Object: Alpha」のオブジェクト表現が返ります。認証を付けないと401です。検証ではAlpha、LOCKED-2、Betaの順に3件作り、応答の instanceId が3だったBetaに対して updateNotes をPUTで呼びました。
curl -u sven:pass -X PUT \
-H "Accept: application/json" -H "Content-Type: application/json" \
-d '{"notes":{"value":"short memo"}}' \
http://localhost:8080/restful/objects/hello.HelloWorldObject/3/actions/updateNotes/invoke
メモの長さを変えた場合と、LOCKED-2(instanceIdは2)に対して呼んだ場合の結果は次のとおりです。
| 条件 | HTTPステータス | 返った理由 |
|---|---|---|
| 10文字のメモ | 200 | 更新後のオブジェクト |
| 20文字を超えるメモ | 422 | メモは20文字以内です |
| 名前がLOCKEDで始まる | 403 | ロック中のため変更できません |
422のときは Warning: 199 RestfulObjects Validation failed ヘッダが付き、本文の invalidReason に検証メッセージが入ります。注意したいのは403の本文で、helloworldの構成ではJavaのスタックトレースがそのまま含まれていました。外部に公開するAPIでは、本番設定でエラー本文に何が出るかを必ず確認してください。
3つのビューアの役割:Wicket UI・Restful Objects・GraphQL
Causewayでは画面やAPIを「ビューア」と呼び、Springの @Import でアプリのマニフェストに必要なものだけを組み込みます。依存をpom.xmlに足すだけでは有効になりません。
- Web UI(Wicket viewer):人が使う業務画面。レイアウトはクラスと同名の
.layout.xmlで調整し、それでも足りない画面だけSpringのコントローラなど別の技術で書き足します。 - REST API(Restful Objects viewer):Restful Objects仕様の実装で、リンクをたどって操作を発見するハイパーメディアAPIです。公開APIとして使う場合はビューモデルだけを出し、エンティティは出さないのが公式の推奨です。リンクで状態遷移を表す考え方はHATEOASとは?RESTレベル3の仕組みとHAL・JSON:APIの実装判断を解説と共通です。
- GraphQL API:Spring GraphQLの上に実装されています。
causeway.viewer.graphql.api-variantで公開範囲を選び、値はQUERY_ONLY・QUERY_AND_MUTATIONS・QUERY_WITH_MUTATIONS_NON_SPEC_COMPLIANTの3つです。
GraphQLについては、helloworldの設定ファイルが query_with_mutations_non_spec_compliant になっている点に注意してください。GraphQLビューアの公式ドキュメントが「GraphQL仕様の『queryは読み取り専用』に違反する」と明記している変種で、query経由で更新系のアクションまで呼べます。スターターをそのまま本番に持ち込まず、QUERY_AND_MUTATIONSかQUERY_ONLYに変えてから公開するのが安全です。
認証・権限と公式エクステンション
認証と認可はSPIで差し替える方式です。認証にはBypass(開発用)、Simple(helloworldの方式)、Spring、Keycloakがあり、認可まで含めて管理するならSecManエクステンションを使います。SecManはユーザー・ロール・権限をデータベースのエンティティとして持つため、権限の管理画面もCauseway自身の画面として生成されます。KeycloakやSpring OAuth2で認証し、認可だけSecManに任せる組み合わせも可能です。
業務アプリで後から必要になりがちな機能は、公式エクステンションとして用意されています。
- Audit Trail:エンティティのプロパティ変更を1項目ずつ記録。3.6.0では更新時だけ記録し、作成・削除を記録しない設定が加わりました
- Command Log・Execution Outbox:アクション呼び出しとプロパティ編集の記録、外部システムへの連携待ち行列
- Session Log:ログインとログアウトの記録
- Tabular・Excel:一覧のXLSX出力
- Flyway:データベーススキーマの移行管理
監査ログとコマンド記録を自前で作らずに済むのは、内部統制の要件がある業務アプリで大きな利点です。
Apache Causewayの採用判断:向く案件と避けるべき案件
Causewayが効くのは、画面の数よりドメインルールの数が多いアプリです。受発注、契約管理、社内の申請・承認のように、エンティティ間の制約や状態ごとの操作可否が複雑な業務では、ルールを1か所に書いて画面・REST・GraphQLで共有できるため、入口ごとに実装した検証条件の食い違いを防ぎやすくなります。業務担当者と画面を見ながらドメインモデルを詰めるプロトタイピングにも向いています。
次の条件に当てはまるなら採用は勧めません。
- 一般消費者向けにUIを作り込む:Wicket viewerの画面は汎用の管理画面の見た目で、デザインの自由度は低いです。フロントエンドを別に作る場合はWicket viewerによる画面生成の利点が減るため、API生成と業務ルールの共通化だけでも採用効果があるかを評価してください。
- 英語の一次情報で調べる体制がない:採用前に、英語の公式ドキュメントを読み、必要に応じてSlackやメーリングリストで調査できる体制を確認してください。
- 2系の資産を当面そのまま動かす:前述のとおり2系にはCVE-2025-64408の修正版がありません。
管理画面を短期間で作ること自体が目的なら、PHPのLaravel Filamentとは?管理画面を短工数で作る構成とNovaとの選択基準のように、画面定義を明示的に書く方式のほうが見た目の調整は楽です。Causewayを選ぶ理由は「画面を書かないこと」より「ドメインモデルを唯一の正にできること」にあります。
受発注や申請・承認のような業務ルールの多いシステムを、Causewayのようなフレームワークで作るか、画面から設計するかで迷う段階なら、一創の業務用・Webアプリ開発で要件の整理から相談できます。
よくある質問
Apache CausewayとApache Isisは同じものですか?
同じプロジェクトです。Apache Isisが改称してApache Causewayになり、2023年3月25日の2.0.0-RC1から新しい名前でリリースされています。パッケージ名と設定キーの接頭辞が isis から causeway に変わったので、古い資料を読むときは読み替えが必要です。
Apache Causewayの最新バージョンはいくつですか?
2026年11月6日時点で、正式な最新版は3.6.0(2026年4月9日)です。Spring Boot 4ベースの4.0系は4.0.0-M2(2026年6月12日)までのマイルストーン版で、正式版は出ていません。最新の状況は公式のリリースノート一覧で確認してください。
動かすにはどのJavaとSpring Bootが必要ですか?
3.6.0はJava 17以上とSpring Boot 3.5.13が前提です。公式スターターアプリはJava 21でビルドする設定なので、試すならJava 21以上を入れてください。4.0系もJava 17が下限で、Spring Boot 4.0.5を使います。
JPAとJDOのどちらを使えばよいですか?
新規開発ならJPA(EclipseLink)です。3.6.0までは両方使えますが、4.0系ではJDO(DataNucleus)のサポートが削除されています。JDOで作ると、4.0へ上げるときに永続化層を書き直すことになります。
Apache Causewayは商用利用できますか?
Apache Software FoundationのプロジェクトなのでApache License 2.0で配布されており、商用アプリへの組み込みもできます。有償の公式サポートはないため、問い合わせ先は公式のSlackやメーリングリスト、JIRAになります。