Java EE 8 (Jakarta EE 8) 新機能まとめ

# Overview
Java EE 8 (JSR 366) が 2017年9月 にリリースされました。
Java EE 8 の 7 からの変更点、新機能についての整理を兼ねてのメモ代わり。
手が空いたときにでも都度追記していきます。

# Impression
いきなり所感だが、Java EE 8 というが、メジャーバージョンアップさせるほどの強力な新機能がそんなに多いとは感じられない。
全体的には Stream や Date and Time API などの Java SE 8 API との親和性向上が図られたっぽい。ラムダにはそんなに対応していない雰囲気？

当初予定していたMVC1.0が無くなったり、一時期進捗が停滞していたりと、これまでの Java EE の仕様策定と比較して、Oracleによるリードが鈍化してきている感は否めない。故に、[Java EE Guardians](https://javaee-guardians.io/)なるものが誕生した所以だろう。
Java EE 7.1 じゃないのか？ という話も耳に挟んだりするけど、おそらくこれまで通り、対応する Java SE のバージョンと揃えておきたいのでしょうか。


# NEWS
### 2017-08-18
投稿したそばから、Oracleが他コミュニティへの移行を示唆。
https://blogs.oracle.com/theaquarium/opening-up-java-ee

### 2017-09-12
Eclipse Foundation に移行を決定
https://blogs.oracle.com/theaquarium/opening-up-ee-update

### 2017-09-18
Java EE 8 Final Release

### 2017-09-29
Java EE の新名称は Eclipse Foundation への移行に伴い、変更が検討されているようです。
以降プロジェクトの名称はEclipse Enterprise for Java (通称**EE4J**) で、あくまでもこれは新ブランド名ではないとのこと。
https://blogs.oracle.com/theaquarium/ee4j-eclipse-enterprise-for-java

### 2018-02-26
Java EE の新名称が Jakarta EE に決定されました。


# New Features

以下の図において、青がバージョンアップされた仕様、オレンジが新しく追加された仕様。
JPAに色がついてないですが、2.2としてメンテナンスリリースされます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/57967/d6bb4cb7-9765-18b4-9e6b-e3f7ffc163c6.png)

## New Specs
### [Java API for JSON Binding (通称:JSON-B)](http://json-b.net/)
* JSONオブジェクトをJavaオブジェクトにバインディングする機能。
* 要はJava EE 7 で投入された JSON-P では、JsonObject というオブジェクトを使って、JSONの操作をするものだったが、JAX-Bのように、文字列としてのJSON を Javaオブジェクト にデシリアライズしたり、Javaオブジェクト を JSON にシリアライズする機能。

* 仕様は [JSR 367](https://www.jcp.org/en/jsr/detail?id=367) としてリリース
* Reference Implementation は Eclipse Project の [Yasson](https://github.com/eclipse/yasson)
* これまでは [Jackson](https://github.com/FasterXML/jackson) などのライブラリで同様のことができていたが、今回JCPによってJSRとしてAPIが標準化された

### [Java EE Security API](https://github.com/javaee-security-spec)
まだちゃんと追えてないので、ざっくりと。
* 認証・認可とそれに伴うユーザ管理機能や、パスワードをリテラルでソースコードに記述しないための、エイリアス機能を有する
* 仕様は [JSR 375](https://www.jcp.org/en/jsr/detail?id=375) としてリリース
* Reference Implementations は [Soteria](https://github.com/javaee/security-soteria)
* これまでベンダー依存(標準化されてない実装依存)コードを記述しなければならなかったが、今回JCPによってJSRとしてAPIが標準化された

## Major Versionup Specs
### Contexts and Dependency Injection for Java 2.0 (通称:CDI)
* 非同期イベント
* SE環境でのCDI利用
* 仕様を3つのサブセットに分割 (core, se, ee)
* Annotation Processor によるコンパイル時DIによる、実行時のメモリ使用量節約

### Bean Validation 2.0
* 型引数への BeanValidation アノテーション対応 (`List<@NotNull String>` とかできるようになったとか)
* `@NotBlank`,`@NotEmpty`,`@Email`, `@PastOrPresent`, `@FutureOrPresent` などが今回新たに標準APIに追加
* Java SE 8 で導入された Repeatable アノテーション対応

### Servlet 4.0
HTTP/2 対応

## Minor Version Up Specs
### JAX-RS 2.1
* SSE (Server Sent Event) 対応
* Reactive Client API 対応

### JSON-P 1.1
* JSON Pointer (RFC 6901) 対応
* JSON Patch (RFC 6902) 対応
* JsonCollections の操作が Lambda, Stream API 対応

### JSF 2.3
意外と機能追加、改善が多い。
JSFって今後需要減っていきそうな気がするけど、業務アプリとかはフロントエンドの技術を使わないでサクッと作れるからいいのかな？

* いろいろ `@Inject` で DI できたり、EL式で参照できるようになる (`FacesContext`, `ExternalContext`, `Session` 等々)
* `f:event` に postRenderView が追加
* WebSocket との親和性向上。f:websocketが追加されて、サーバサイドからのプッシュ通知が簡単に実現できる(あとで、ちょっと試したい)
* クラスレベルBeanValidation対応
* `ui:repeat` の Map, Iteratable インターフェース対応
* EL式でのstatic変数へのアクセスに対応
* `h:selectOneRadio` のラジオボタンの自由なレイアウトに対応
* JSFの各種インターフェースがジェネリクス対応し、型安全に要約対応
* `@ManagedProperty`アノテーションが CDI Bean に対応
* `javax.faces.bean`がパッケージごと、Deprecated(非推奨)扱いになり、CDIのAPIを使うようにとのこと。

この他にも細かい変更点がたくさん入ってるようです。

### JPA 2.2
* Date and Time API (JSR310) 対応。EntityにLocalDateTimeなどの型が使用できるようになる。java.sql.Timestampとかjava.util.Dateなどの辛い時代がようやく終わる。(EE6以前は実装依存で解決、EE7時代はみんなAttributeConverter書いてたに違いない)
* `@NamedQuery` や `@JoinColumn` などが `@Repeatable`対応。いちいち `@NamedQueries` とか　`@JoinColumns` を使わなくて良くなった。
* AttributeConverter が CDIをサポート。 `@Inject` で CDI Bean がインジェクションできるようになった。(なんで、JPA2.1の仕様に入らなかったんだっけ?)
* Query に `getResultStream` メソッドが追加。内部的には単純に、[`getResultList().stream()`](https://github.com/eclipse/javax.persistence/blob/2.2.0-RC3/src/javax/persistence/Query.java#L86)してるだけらしい。

# Java EE 8 Compatible Servers
Java EE 9 が 2018年 にリリースされるのだとしたら、あまり追従しない可能性も否定できない？
コンパチが GlassFish 以外にどれだけ出るかが見どころ。
MicroProfile が標準化されれば、MicroProfile対応は結構出そうな気はする。

* GlassFish 5 (RI)
* Payara Server 5
* WildFly 12 以降、EE8の機能が使えるように徐々に追加されていくっぽい (以降は四半期毎にリリースとのこと)