JavaOne2013レポート 9/23 (2日目)

理解できた範囲でキーノートの新しい発表というとAvatarのオープンソース化しかなかったので、2日目のセッションからまとめ。

Notify Your Mobile Clients by Integrating Push Networks and Java EE 7 [CON5073]

RedHatAeroGear開発者のセッション。
テーマはモバイル(iOS, Android ..)に対して、push通知をどのように実装するかについて。

まず現状の整理として取り上げた手段が3点。

いずれの案も各デバイスのAPIに依存していたり、デモではObjective-Cのコードが長かったりAndroidXMLが冗長であることを強調。いずれの手段もマルチデバイス対応という点でつらい部分がある。

このセッションにおいて提案された解決策はAero Gear Pushの使用。デバイスごとにコーディングしなくても良くなるらしい。

セッションを見るだけでは具体的なAPIまでは理解しきれなかったので、帰ってからチュートリアルをやってみようと思う。

Securing JAX-RS RESTful Services [CON5179]

セッションのテーマはどうやってセキュアなJAX-RSエンドポイントを実現するか。

HTTPのBASIC認証やダイジェスト認証を使う案
  • Java EE コンテナに載っているJAASと組み合わせることができて、最初はシンプルに実装できる。
  • リソース(URL)ごとの設定は、web.xmlに定義する。
  • その代わり、変更に弱い脆いコード(XML)になるのが弱点。
アノテーションによる認可のコントロール
OAuthを使う案

Three Key Concepts for Understanding JSR 352: Batch Applications for the Java Platform [CON7292]

Java Batchに関するセッション。テーマはJSR352の機能に関する説明。
実践的なTipsのような情報はなかった。去年のjBatchのセッションでは、もっとバッチの実行頻度を短くしましょう、バッチ数に応じてJavaVMインスタンス数を自動調整するなどWebShareの実装の話があったが、今年はあくまでJSR352仕様の解説のみ。

What’s New with Bean Validation and Expression Language in Java EE 7 [BOF7696]

JavaEE7から導入された、BeanValidation1.1とEL3.0の機能紹介がテーマ。

BeanValidation1.1
  • CDIが使えるようになった。例としてカスタムバリデータ(ConstantValidator)の実装で、チェックロジックを@Injectで注入。
  • Method Validation の導入。例では、ユーザ作成のビジネスロジックの引数(ユーザ名など)に必須属性かどうかを@NotNullなどを使って定義。
/**
  * 名前、パスワードは必須、名前は20歳以上の場合は、ユーザを生成。
  */
public void createUser(@NotNull String name, @NotNull String password, @Min(20) int age... ) {
    // TODO ユーザエンティティの永続化など
}

今までバリデーションというと、Java EE の3層モデル(プレゼンテーション:P層-ビジネスロジック:B層-パーシステンス:I層)で、プレゼンテーション層の役割だと思っていたが、紹介されたコードはビジネスロジックAPIにMethod Validationを使っていた。確かに、ビジネスロジックの入力条件はビジネスロジックに定義した方が良いと思った。今までのJava EEアプリケーションは、P層で検証済みで正しい情報が流れてくる前提でB層を実装していたが、P層は名のとおり見た目に関するコントロールに専念させる方が適切と思う。

EL3.0
  • ラムダ式や、Streaming-APIに似た機能が使える。小計のような、エンティティには持たせたくない、RequestScopeに直接登録するのも微妙と思うとき使えると思った。
[1,2,3,4].sum();

What’s New in Java Transaction Processing [BOF3433]

JTA1.2の新機能がテーマ。EJBで可能なトランザクションは、CDIでも一通り網羅された。

EJBで実装されていたコンテナ管理トランザクションの機能は網羅されていたので、トランザクションコンポーネントを目的とするなら@Transactionalを中心に使うことになりそう。@Statelessでは、EJBを使い慣れてる人にはトランザクション境界だとわかりやすいが、例えばSpringを使ってる人にとっては@Transactionalの方が馴染み深いと思う。@TransactionScopeもステートフルセッションBeanの代わりに使えそう。

今後のEJBの使い道は@Asynchronousによる非同期処理と本来の分散処理であるリモートEJBを使いたいケースになるだろう。

他にもG1GCのセッションに出たり、Java VMのチューニングのQ&Aセッションに出たが、ほぼ聞き取れず...。