Java EE 7はどこが変わった? そしてJava EE 8はどう変わる?──Java EEエバンジェリストのレザ・ラーマンが語る

Oracle Java & Developers編集部
2014-07-04 19:15:00
  • このエントリーをはてなブックマークに追加

JAX-RS 2.0

 JAX-RS 2.0でも、興味深い変更が行われています。主なポイントは、HTML5への対応とコーディング量の削減です。メッセージ・フィルタやエントリ・インターセプタを備えており、Java Servletのような機能を実現するほか、非同期処理をサーバ・サイドとクライアント・サイドの両方で実行することができます。

 また、JAX-RS 2.0はハイパーメディアをサポートしており、コンテンツ・ネゴシエーションによって、さまざまなデータの制御を容易にしています。次に示すのはClient API(パッケージjavax.ws.rs.client)を使ったコードの例ですが、ご覧のとおり、エンドポイントにパラメータを渡すことで、インバウンド/アウトバウンドのコンテンツを処理することができます。

【JAX-RS 2.0のClient APIを使ったプログラム】

// Get instance of Client Client client = ClientBuilder.newClient(); // Get customer name for the shipped products String name = client.target("../orders/{orderId}/customer") .pathParam("orderId", "10") .queryParam("shipped", "true") .request() .get(String.class);

JPA 2.1

 JPA(Java Persistence API) 2.1では、数多くの重要な機能強化が図られました。例えば、スキーマをダイレクトに生成する機能や、ストアド・プロシージャ、エンティティ・グラフなどが追加されています。

 例えば、エンティティ・グラフを使うと、リトリーブしたいデータをユーザーが定義することが可能になります。1つの名前を付けたユースケースに対して、レイジー・ローディングを使うことなくグラフ構造を作れるのです。これは非常に便利な機能であり、ウィザードのように対話的に使うことができます。

JTA 1.2

 JTA(Java Transaction API) 1.2では、プロパティを設定してスキーマを生成し、それをファイルに入れたうえでデータを入れて初期化して、どのように処理するかを設定します。このバージョンでは、開発者向けの機能はあまり追加されておらず、主に実装面の改良が行われました。

 JTA 1.2では、EJBではなく、CDI(@Transactionalアノテーション)によってトランザクションを定義することができます。今日、トランザクション処理ではEJBを使うのが一般的ですが、今後はCDIとの親和性を高めるための改良が続きます。例えば、Java EE 8では、宣言したサービスをCDIによってManaged Beanの外部でも使えるようにする予定です。

【@Transactionalアノテーションを使ったプログラムの例】

@Inherited @InterceptorBinding @Target({TYPE, METHOD}) @Retention(RUNTIME) public @interface Transactional { TxType value() default TxType.REQUIRED; Class[] rollbackOn() default {}; Class[] dontRollbackOn() default {}; } @Transactional(rollbackOn={SQLException.class}, dontRollbackOn={SQLWarning.class}) public class UserService {...}

JSF 2.2

 JSF 2.2では、HTML5への対応、標準化されたフローへの対応など、多くの機能が追加されました。また、@ViewScopedアノテーションがManaged Beanでも使えるようになっています。そのほか、f:viewActionコンポーネント、ステートレス・ビュー、リソース・ライブラリ・コントラクトの追加などが行われました。

 次に示すのは、HTML5に対応したコードの例です。JSF 2.2では、ネーティブなHTMLのコンポーネントを使い、これまでと同じ流儀で属性値を書けるようになっています。

【JSF 2.2のHTML5に対応したコード】

<html> ... <input type="color" jsf:value="#{colorBean.color2}" /> <input type="date" jsf:value="#{calendarBean.date1}" /> ... </html>

 また、次に示すのは、JSF 2.2で新たに追加されたFaces Flowを使ったアプリケーションの例です。

【Faces Flowを使ったアプリケーションの例】

@Named @FlowScoped(id="flow-a") public class FlowABean implements Serializable { public String getName() { return "FlowABean"; } public String getReturnValue() { return "/return1"; } @Produces public Flow getFlow(FlowBuilder builder) { builder.startNode("router1"); builder.flowReturn("success").fromOutcome("/complete"); builder.flowReturn("errorOccurred").fromOutcome("error"); builder.switchNode("router1") .navigationCase().condition("#{facesFlowScope.customerId == null}") .fromOutcome("create-customer") .defaultOutcome("view-customer"); builder.viewNode("create-customer"); builder.viewNode("maintain-customer-record"); builder.methodCall("upgrade-customer") .method("#{maintainCustomerBean.upgradeCustomer}").defaultOutcome("view-customer"); builder.initializer("#{maintainCustomerBean.initializeFlow}"); builder.finalizer("#{maintainCustomerBean.cleanUpFlow}"); return builder.getFlow(); } }

 フローは、オブジェクトのスコープを管理する仕組みであり、リクエスト・セッションとともに使います。これを使うことで、特定のページ・フローの間だけ有効なオブジェクトを作ることができます。つまり、アプリケーションにワークフローを組み込むことが可能になるのです。

バッチ処理

 Java EE 7では、新たにBatch Applications for the Java Platform(通称:jBatch)としてバッチ処理が標準化されています。これに関しては、多くの開発者に「なぜバッチ処理をサポートする必要があるのか」と聞かれました。その理由は、エンタープライズの世界では、これまでCOBOLやCICSなどを使って複雑なバッチ処理が行われてきたからです。実際、「バッチ処理をJavaで記述したい」というニーズは多く、これをサポートすることは非常に重要だと考えたのです。

 Java EE 7のバッチ処理機能は、IBMの主導の下に開発されています。アプリケーション・サーバのアーキテクチャーの一部になっており、すべてのコンテナで利用することができます。アプリケーション・サーバから制御して、リアルタイムにジョブの停止や再起動が行えます。プログラミング・モデルはPOJOを書くのと同じくらいシンプルです。

Bean Validation 1.1

 Bean Validation 1.1はマイナーなアップデートですが、最大の変更点はメソッドの制約を定義できることです。これは、インプットやアウトプットを継承する際に役立ちます。

Concurrency Utilities

 Java EE 7におけるConcurrency Utilitiesサポートは、非常に興味深いものです。Java EEでは、さまざまなAPIを提供し、バックグラウンドでバッチ処理を動かしたり、EJBコンポーネントを並列に処理したりといった具合に並列処理をサポートしてきました。

 しかし、特定の環境では、ロー・レベルの処理も必要になります。その際、問題になるのが、スレッドの並列処理をコンテナで管理できないということです。この問題を解決するのがConcurrency Utilitiesです。Concurrency Utilitiesでは、独自にスレッドを作る代わりに、コンテナの管理下でスレッドを生成して実行します。次に示すプログラムは、Concurrency Utilitiesを使ったサーブレットの例です。

【Concurrency Utilitiesを使ったサーブレットの例】

public class TestServlet extends HTTPServlet { @Resource(name="concurrent/MyExecutorService") ManagedExecutorService executor; Future future = executor.submit(new MyTask()); class MyTask implements Runnable { public void run() { ... // Task logic } } }

その他の変更点

 以上が主なポイントですが、Java EE 7では、このほかにも次のような変更が加えられています。

 まず、Java Servlet 3.1では、ノンブロッキングのI/OやWebSocket対応のアップグレード、セキュリティの強化などが行われました。また、CDI 1.1では、@AroundConstructや@Vetoedなどのアノテーションが拡張されています。そして、EL 3.0ではラムダ式、コレクション、スタンドアロンAPIなどに対応し、EJB 3.2ではCMP(Container Managed Persistence)、BMP(Bean Managed Persistence)をサポートから除外しました。

Java EE 8の開発はコミュニティ主導で進む

 続いて、Java EE 8では現在、どのような方向性で機能強化が検討されているのかを紹介します。

 Java EE 8のゴールの1つは、これまで以上に"コミュニティ主導"なものにすることである。そのために、私たちはJavaコミュニティの約4500名の方々に対して、3種類の調査を行いました。そのうちの2つは、「Java EE 8にどのような機能を望み」、「それらの間にどのような優先順位があるのか」を問うものです。Java EE 8のJSRは、これらの調査の結果を踏まえて作成します。

 調査の結果、最も多かった要望は「JSONバインディング(JSONB)」のサポートで、約14%の方が必要だと答えました。次に「シンプルなセキュリティの実現」が約11%で続いています。第3位は「JCacheのサポート」で約10%、第4位には、約8%がセキュリティをシンプルにするために必要だと考える「セキュリティ・インターセプタ」が入りました。

 Java EE 8で検討されている課題をまとめると、アライメントをHTML5のランドスケープに適合させる、HTTP 2.0やCDI 2.0への対応、セキュリティやマルチテナントといったクラウドへの対応などが挙げられます。また、JTA 2.0では、同じデータベースのテーブルを複数のアプリケーションから使えるようにすることなどが検討されています。

 以上、Java EE 7の主要な変更点と、Java EE 8で検討されている主な強化ポイントを紹介しました。Java EE 8に対する要望の調査結果についての詳細は、ブログ記事「Linda DeMichiel's Blog」をご覧ください。調査結果をまとめたレポートをダウンロードすることもできます。

 Java EEは、今後もコミュニティの要望を取り入れ、皆さんとともに発展していきます。ご要望がおありの際は、ぜひ私たちまでフィードバックしてください。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]