Download - Java EE8 Report
Java EE 8 ReportJavaOne2014 サンフランシスコ 報告会 Tokyo
2014/10/18 上妻 宜人
• JavaOne 3 回生
• Java/AP サーバサポート , トラブル対応
• Software Design 2014 年 10 月号
上妻 宜人あげつま のりと
2012 2013 2014
Java EE 8SpecLead Linda DeMichiel
コミュニティアンケート結果JSONB, セキュリティ機能簡易化 , JCache, MVC …
Java EE 8 テーマコミュニティ要望・最新技術動向に応じた 3 つのテーマ
• HTML5 / Web 層の拡張• HTTP2, SSE, JSON Binding, JSON Patch ..
• かんたん開発• JSF @Inject FacesContext, CDI セキュリティインターセプ
タ
• クラウド上でのインフラ• REST API 運用監視 , デプロイ etc
まだアイディア段階のため、以降の内容は変更の可能性あり
Servlet 4.0JSR369 https://www.jcp.org/en/jsr/detail?id=369
Servlet 4.0HTTP/2 対応• HTTP/2
• Google の SPDY プロトコルが原型• バイナリフレーム / ヘッダ圧縮 / 多重化• ヘッダの意味合い (GET/POST/200 OK など ) は基本的に踏
襲 client serverclient server
.html
.js, .png, .css
client server
ブラウザ実装によっては同時接続数『 6 』 1TCP 接続で多重化
Servlet 4.0HTTP/2 ストリームによる多重化
Connection : 1 つの TCP コネクション
Stream : コネクションに含まれるチャネル
Stream #1
Stream #2 .. #n
http://chimera.labs.oreilly.com/books/1230000000545/ch12.html#HTTP2_STREAMS_MESSAGES_FRAMES
Request Message
:method: GET:path: /index.html:version: HTTP/2.0
Frame : HTTP2.0 通信の最小単位
:status:200:version: HTTP/2.0
Server: nginx/..
HEADERS frame
responsepayload
DATA frameResponse Message
Servlet 4.0Servlet API 追加のアイディア
• StreamID へのアクセス• HttpServletRequest / HttpServletReponse が対象• int getStreamId()
Servlet 4.0HTTP/2 サーバプッシュ
client server
.html
.js
.png
.css
• WebSocket を置き換えるものではない
• 関連リソースをサーバプッシュ• 例えば html の要求がきたら• 関連の js, png, css もプッシュす
る
従来の 1 リクエスト = 1 レスポンス型では対応できないので要検討
public void doGet(HttpServletRequest req, HttpServletResponse res) ...
Java SE 9 でも HTTP/2HTTP 1.1 / 2 を対象に API を追加予定 (JEP110)
HttpRequestGroup group = HttpRequestGroup.create();HttpRequest res = group.createRequest() .setRequestMethod(“POST”) .setRequestURI(new URI(“http//www.foo.com/a/b”)) .setRequestBody(“Param1=1,Param2=2”) .onResponseHeader (“X-Foo”, (request, name, value) -> System.out.printf(“received an X-Foo header”); }) .sendRequest() .waitForCompletion();
MVC 1.0JSR371 https://jcp.org/en/jsr/detail?id=371
MVC 1.0アクションベース MVC の導入
• SpringMVC, JerseyMVC, Struts, VRaptor ...
• そもそも必要? JAX-RS に入れる?の議論があった
が、 結果的に独立した仕様として検討がスタートQ. Java EE は JSF に加えて新たな MVC をサポートすべきですか?
https://java.net/downloads/javaee-spec/JavaEE8_Community_Survey_Results.pdf
MVC 1.0MVC 1.0 テーマ
• 新たなテンプレートの”標準化”は対象外• Java EE 標準としては既に JSP と Facelets がある• 標準化はせずに、 OSS 実装と連携するアプローチ
• 既存仕様との連携• CDI, Bean Validation
MVC 1.0JavaOne の BOF でのラフアイディア• 初期 HTML 画面ページ
<form action=”/rough-example/form1a.jsp”><input id="input1" value="#{roughExampleBean.value}"/> <input id="submit" type="submit" value="Submit"/></form>
MVC 1.0JavaOne の BOF でのラフアイディア• CDI - Managed Bean
@Named("roughExampleBean”)@RequestScopedpublic class RoughExampleBean implements Serializable {
private String value;
@Path(value = "/form1a.jsp”) public String form1(@Inject HttpServletRequest request) { String input1 = request.getParameter("inputText1"); setValue("We set input1 manually to - " + input1); return "/form1b.jsp”; } … omitted getter/setter methods …}
MVC 1.0JavaOne の BOF でのラフアイディア
• 遷移先の HTML ページ
<body> result is: #{roughExampleBean.value}</body>
JSF 2.3JSR372 https://www.jcp.org/en/jsr/detail?id=372
JSF 2.3重複仕様の整理 / 小さな機能改善• CDI 連携の強化
• @Inject FacesContext
• Validator や Converter 実装クラスに @Inject できるようにする
• @javax.faces.bean.ManagedBean の扱い見直し• 非推奨ではなく、 @javax.inject.Named と同様として扱う
• EL 式のキャッシュによる性能向上
• マルチコンポーネントのバリデーション
JAX-RS 2.1JSR370 https://www.jcp.org/en/jsr/detail?id=370
JAX-RS 2.1パフォーマンス / SSE サポート• パフォーマンス向上
• Non-Blocking I/O API のサポート ( 主にサーバサイド )
• Reactive プログラミングモデル ( 主にクライアントサイド )
• SSE - Server Sent Event のサポート
• Java EE 内連携の強化• JSON-B : Java API for JSON Binding との連携• MVC1.0 との連携?
JSON-B 1.0JSR367 https://jcp.org/en/jsr/detail?id=367
JSON-B 1.0JSON と Java オブジェクトのマッピング
• JAXB (XML Binding) と同様に相互変換• 既存実装として Jackson data binding など
public class Customer { private String name; private String mailAddr; private String phoneNumber; ...}
{ “name”:“Norito Agetsuma”, “mailAddr”:“[email protected]”, “phoneNumber”:“xxx-xxxx-xxxx”}
JSON-B 1.0コード例 : マーシャライズ (Java -> JSON)
JsonContext context = new JsonContext.newInstance();
// プロパティ設定 , 見やすい JSON 生成 PrettyPrinting はオプションMarshaller marshaller = context.createMarshaller() .setProperty(Marshaller.Property); .setPrettyPrinting(true);
// JSON 文字列変換String string = marshaller.marshall(myObject);
// ファイルへmarshaller.marshall(myObject, new FileWriter(“file.json”));
JSON-B 1.0コード例 : マッピングアノテーション
• プロパティ名変更
• Enum マッピング
@JsonProperty(“longDesc”)String longDescription;
{ “longDesc”:”some params..”}
@JsonEnumpublic enum Option { @JsonEnumValue(“1”) OPTION_1, @JsonEnumValue(“2”) OPTION_2, @JsonEnumValue(“3”) OPTION_3}
{ “Option”:1}
JSON-P 1.1JSR TBD : JSON Patch など
JSON-P 1.1JSON Processing - Java EE 7 導入の JSON 処理 API
{ “name”:”Norito Agetsuma”, “mailAddr”:”[email protected]”, “phone”:”xxx-xxxx-xxxx”}
JsonObject customer = Json.createObjectBuilder() .add(“name”, “ Norito Agetsuma”) .add(“mailAddr”, “[email protected]”) .add(“phone”, “xxx-xxxx-xxxx”) .build();
StringWriter json = new StringWriter();try (JsonWriter writer = Json.createWriter(json)) { writer.writeObject(customer);}json.toString();
JSON-P 1.1Java EE 8 - JSON Patch
• JSON データの一部を置き換える仕組み – RFC6902
• HTTP “PATCH” と組み合わせて差分更新に使う• “PUT” は対象 URL のリソース全体を置き換えることを示
す• “POST” はリソースの新規作成に用途を絞るhttp://xxx/user/1
{ “name”:”n-agetsuma” “state”:”chiba tokyo” “phone”:”xxx-xxxx-xxxx”}
一部を変更したい
新規項目を追加したい
JSON-P 1.1HTTP “PATCH” メソッドで差分適用
{ “name”:”Norito Agetsuma” “state”:”Chiba tokyo” “ phone”:”xxx-xxxx-xxxx” ...}
PATCH /user/1 HTTP1.1Content-Type: application/json-patch[ {“op”:”replace”, “path”:”/state”, “value”:”tokyo”}, {“op”:”add”, “path”:”/phone”, “value”:”xxx-xxxx-xxxx”}]
JSON-P 1.1JSON Patch - API のアイディア// パッチ対象とパッチの生成JsonObject target = Json.createObjectBuilder().add(..).build();JsonArray patch = Json.createArrayBuilder() …build();
// パッチから JsonPatch の生成JsonPatch jsonpatch = Json.createPatch(patch);
// パッチの適用と結果取得JsonArray result = jsonpatch.apply(target);
CDI 2.0JSR365 https://jcp.org/en/jsr/detail?id=365
CDI 2.0非同期イベント機能の導入
@InjectEvent<NotifyAlarm> event;
public void fire() { // 各@Observesメソッドの終了を待たずに応答が返る event.fire(new NotifyAlarm(“server hang”));}
public void consumeA( @Observes(asynchronous=true) NotifyAlarm n) { n.getDetails(); ...}public void consumeB( @Observes(asynchronous=true) NotifyAlarm n) {..}
通知
通知する側
通知される側
通知される側
CDI 2.0モジュール化 , Java SE CDI起動 API
• 仕様のモジュール分割• CDI 仕様が肥大化してきて、 Weld 以外の安定実装が少な
い• 3 つに分割して、 3rd パーティ実装による機能提案を加速
• CDI Light : DI のみ。イベント , コンテキスト , AOP なし
• Events : CDI による Observer パターン実現 @Observes
等• Full CDI : 全ての仕様
• Java SE 上での CDI コンテナ起動 API の標準化
Java EE Management API 2.0JSR TBD : REST管理 API の標準化
Java EE Management API 2.0REST API による監視・デプロイの標準化• J2EE Management 1.1 - JSR77 の更新
• RESTT API による管理• 既に JSR77 で定義されている Java EE管理モデルに準拠• SSE - Server Sent Event による通知モデルの定義• MEJB API - リモート EJB によるアクセス仕様のオプショ
ン化
• REST API によるアプリケーションのデプロイ
Java EE Management API 2.0J2EE管理対象オブジェクトのモデル抜粋
http://download.oracle.com/otn-pub/jcp/j2ee_management-1_1-mrel-eval-oth-JSpec/j2ee_management-1.1-mrel-spec.pdf
Java EE Security1.0JSR TBD : セキュリティ関連機能の再構
築
Java EE Security 1.0詳細についてはこれから検討が始まる予定
• 検討スコープを整理中• ユーザ管理• ロールマッピング• REST の認証・認可 ...
• CDI インターセプタによる認可制御
Java EE 8 ScheduleFinal 仕様リリースは 2016 年予定
• Early Draft 2015/Q1 アイディアが出始める
• Public Review 2015/Q3大分内容が固まってくる
• Proposed Final Draft 2015/Q4仕様によっては Final Draft で複数回の修正あり
• Final Release 2016/Q3
GlassFish 5Java EE 8 も RI は GlassFish
GlassFish5 に乞うご期待