Java EE 8 Report 
JavaOne2014 サンフランシスコ報告会Tokyo 
2014/10/18 上妻宜人
上妻宜人 
あげつまのりと 
• JavaOne 3回生 
2012 2013 2014 
• Java/APサーバサポート, トラブル対応 
• Software Design 2014年10月号
Java EE 8 
SpecLead 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.0 
JSR369 https://www.jcp.org/en/jsr/detail?id=369
Servlet 4.0 
HTTP/2 対応 
• HTTP/2 
• GoogleのSPDYプロトコルが原型 
• バイナリフレーム/ ヘッダ圧縮/ 多重化 
• ヘッダの意味合い(GET/POST/200 OK など) は基本的に踏襲 
client server client server 
.html 
.js, .png, .css 
client server 
ブラウザ実装によっては 
同時接続数『6』1TCP接続で多重化
Servlet 4.0 
HTTP/2 ストリームによる多重化 
Connection : 1つのTCPコネクション 
Stream #1 
Stream : コネクションに含まれるチャネル 
Response Message 
HEADERS frame 
:status:200 
:version: HTTP/2.0 
Server: nginx/.. 
Stream #2 .. #n 
Request Message 
Frame : HTTP2.0通信の最小単位 
:method: GET 
:path: /index.html 
:version: HTTP/2.0 
DATA frame 
response 
payload 
http://chimera.labs.oreilly.com/books/1230000000545/ch12.html#HTTP2_STREAMS_MESSAGES_FRAMES
Servlet 4.0 
Servlet API追加のアイディア 
• StreamIDへのアクセス 
• HttpServletRequest / HttpServletReponse が対象 
• int getStreamId()
Servlet 4.0 
HTTP/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/2 
HTTP 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.0 
JSR371 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.0 
MVC 1.0 テーマ 
• 新たなテンプレートの”標準化”は対象外 
• Java EE標準としては既にJSPとFaceletsがある 
• 標準化はせずに、OSS実装と連携するアプローチ 
• 既存仕様との連携 
• CDI, Bean Validation
MVC 1.0 
JavaOneのBOFでのラフアイディア 
• 初期HTML画面ページ 
<form action=”/rough-example/form1a.jsp”> 
<input id="input1" value="#{roughExampleBean.value}"/> 
<input id="submit" type="submit" value="Submit"/> 
</form>
MVC 1.0 
JavaOneのBOFでのラフアイディア 
• CDI - Managed Bean 
@Named("roughExampleBean”) 
@RequestScoped 
public 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.0 
JavaOneのBOFでのラフアイディア 
• 遷移先のHTMLページ 
<body> 
result is: #{roughExampleBean.value} 
</body>
JSF 2.3 
JSR372 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.1 
JSR370 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.0 
JSR367 https://jcp.org/en/jsr/detail?id=367
JSON-B 1.0 
JSONとJavaオブジェクトのマッピング 
• JAXB (XML Binding) と同様に相互変換 
• 既存実装としてJackson data binding など 
public class Customer { 
private String name; 
private String mailAddr; 
private String phoneNumber; 
... 
} 
{ 
“name”:“Norito Agetsuma”, 
“mailAddr”:“test@gmail.com”, 
“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 
コード例: マッピングアノテーション 
• プロパティ名変更 
@JsonProperty(“longDesc”) 
String longDescription; 
• Enumマッピング 
{ 
“longDesc”:”some params..” 
} 
@JsonEnum 
public enum Option { 
@JsonEnumValue(“1”) OPTION_1, 
@JsonEnumValue(“2”) OPTION_2, 
@JsonEnumValue(“3”) OPTION_3 
} 
{ 
“Option”:1 
}
JSON-P 1.1 
JSR TBD : JSON Patch など
JSON-P 1.1 
JSON Processing - Java EE 7 導入のJSON処理API 
JsonObject customer = Json.createObjectBuilder() 
.add(“name”, “ Norito Agetsuma”) 
.add(“mailAddr”, “test@gmail.com”) 
.add(“phone”, “xxx-xxxx-xxxx”) 
.build(); 
StringWriter json = new StringWriter(); 
try (JsonWriter writer = Json.createWriter(json)) { 
writer.writeObject(customer); 
} 
json.toString(); 
{ 
“name”:”Norito Agetsuma”, 
“mailAddr”:”test@gmail.com”, 
“phone”:”xxx-xxxx-xxxx” 
}
JSON-P 1.1 
Java 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.1 
HTTP “PATCH” メソッドで差分適用 
PATCH /user/1 HTTP1.1 
Content-Type: application/json-patch 
[ 
{“op”:”replace”, “path”:”/state”, “value”:”tokyo”}, 
{“op”:”add”, “path”:”/phone”, “value”:”xxx-xxxx-xxxx”} 
] 
{ 
“name”:”Norito Agetsuma” 
“state”:”Chiba tokyo” 
“ phone”:”xxx-xxxx-xxxx” 
... 
}
JSON-P 1.1 
JSON 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.0 
JSR365 https://jcp.org/en/jsr/detail?id=365
CDI 2.0 
非同期イベント機能の導入 
@Inject 
Event<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.0 
JSR TBD : REST管理APIの標準化
Java EE Management API 2.0 
REST 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.0 
J2EE管理対象オブジェクトのモデル抜粋 
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.0 
JSR TBD : セキュリティ関連機能の再構築
Java EE Security 1.0 
詳細についてはこれから検討が始まる予定 
• 検討スコープを整理中 
• ユーザ管理 
• ロールマッピング 
• RESTの認証・認可... 
• CDIインターセプタによる認可制御
Java EE 8 Schedule 
Final仕様リリースは2016年予定 
• Early Draft 2015/Q1 
アイディアが出始める 
• Public Review 2015/Q3 
大分内容が固まってくる 
• Proposed Final Draft 2015/Q4 
仕様によってはFinal Draftで複数回の修正あり 
• Final Release 2016/Q3
GlassFish 5 
Java EE 8もRIはGlassFish 
GlassFish5に乞うご期待

Java EE8 Report

  • 1.
    Java EE 8Report JavaOne2014 サンフランシスコ報告会Tokyo 2014/10/18 上妻宜人
  • 2.
    上妻宜人 あげつまのりと •JavaOne 3回生 2012 2013 2014 • Java/APサーバサポート, トラブル対応 • Software Design 2014年10月号
  • 3.
    Java EE 8 SpecLead Linda DeMichiel
  • 4.
  • 5.
    Java EE 8テーマ コミュニティ要望・最新技術動向に応じた3つのテーマ • HTML5 / Web層の拡張 • HTTP2, SSE, JSON Binding, JSON Patch .. • かんたん開発 • JSF @Inject FacesContext, CDIセキュリティインターセプタ • クラウド上でのインフラ • REST API 運用監視, デプロイetc
  • 6.
  • 7.
    Servlet 4.0 JSR369https://www.jcp.org/en/jsr/detail?id=369
  • 8.
    Servlet 4.0 HTTP/2対応 • HTTP/2 • GoogleのSPDYプロトコルが原型 • バイナリフレーム/ ヘッダ圧縮/ 多重化 • ヘッダの意味合い(GET/POST/200 OK など) は基本的に踏襲 client server client server .html .js, .png, .css client server ブラウザ実装によっては 同時接続数『6』1TCP接続で多重化
  • 9.
    Servlet 4.0 HTTP/2ストリームによる多重化 Connection : 1つのTCPコネクション Stream #1 Stream : コネクションに含まれるチャネル Response Message HEADERS frame :status:200 :version: HTTP/2.0 Server: nginx/.. Stream #2 .. #n Request Message Frame : HTTP2.0通信の最小単位 :method: GET :path: /index.html :version: HTTP/2.0 DATA frame response payload http://chimera.labs.oreilly.com/books/1230000000545/ch12.html#HTTP2_STREAMS_MESSAGES_FRAMES
  • 10.
    Servlet 4.0 ServletAPI追加のアイディア • StreamIDへのアクセス • HttpServletRequest / HttpServletReponse が対象 • int getStreamId()
  • 11.
    Servlet 4.0 HTTP/2サーバプッシュ client server .html .js .png .css • WebSocketを置き換えるものではない • 関連リソースをサーバプッシュ • 例えばhtmlの要求がきたら • 関連のjs, png, css もプッシュする 従来の1リクエスト= 1レスポンス型では対応できないので要検討 public void doGet(HttpServletRequest req, HttpServletResponse res) ...
  • 12.
    Java SE 9でもHTTP/2 HTTP 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();
  • 13.
    MVC 1.0 JSR371https://jcp.org/en/jsr/detail?id=371
  • 14.
    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
  • 15.
    MVC 1.0 MVC1.0 テーマ • 新たなテンプレートの”標準化”は対象外 • Java EE標準としては既にJSPとFaceletsがある • 標準化はせずに、OSS実装と連携するアプローチ • 既存仕様との連携 • CDI, Bean Validation
  • 16.
    MVC 1.0 JavaOneのBOFでのラフアイディア • 初期HTML画面ページ <form action=”/rough-example/form1a.jsp”> <input id="input1" value="#{roughExampleBean.value}"/> <input id="submit" type="submit" value="Submit"/> </form>
  • 17.
    MVC 1.0 JavaOneのBOFでのラフアイディア • CDI - Managed Bean @Named("roughExampleBean”) @RequestScoped public 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 … }
  • 18.
    MVC 1.0 JavaOneのBOFでのラフアイディア • 遷移先のHTMLページ <body> result is: #{roughExampleBean.value} </body>
  • 19.
    JSF 2.3 JSR372https://www.jcp.org/en/jsr/detail?id=372
  • 20.
    JSF 2.3 重複仕様の整理/小さな機能改善 • CDI 連携の強化 • @Inject FacesContext • ValidatorやConverter実装クラスに@Injectできるようにする • @javax.faces.bean.ManagedBeanの扱い見直し • 非推奨ではなく、@javax.inject.Namedと同様として扱う • EL式のキャッシュによる性能向上 • マルチコンポーネントのバリデーション
  • 21.
    JAX-RS 2.1 JSR370https://www.jcp.org/en/jsr/detail?id=370
  • 22.
    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 との連携?
  • 23.
    JSON-B 1.0 JSR367https://jcp.org/en/jsr/detail?id=367
  • 24.
    JSON-B 1.0 JSONとJavaオブジェクトのマッピング • JAXB (XML Binding) と同様に相互変換 • 既存実装としてJackson data binding など public class Customer { private String name; private String mailAddr; private String phoneNumber; ... } { “name”:“Norito Agetsuma”, “mailAddr”:“test@gmail.com”, “phoneNumber”:“xxx-xxxx-xxxx” }
  • 25.
    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”));
  • 26.
    JSON-B 1.0 コード例:マッピングアノテーション • プロパティ名変更 @JsonProperty(“longDesc”) String longDescription; • Enumマッピング { “longDesc”:”some params..” } @JsonEnum public enum Option { @JsonEnumValue(“1”) OPTION_1, @JsonEnumValue(“2”) OPTION_2, @JsonEnumValue(“3”) OPTION_3 } { “Option”:1 }
  • 27.
    JSON-P 1.1 JSRTBD : JSON Patch など
  • 28.
    JSON-P 1.1 JSONProcessing - Java EE 7 導入のJSON処理API JsonObject customer = Json.createObjectBuilder() .add(“name”, “ Norito Agetsuma”) .add(“mailAddr”, “test@gmail.com”) .add(“phone”, “xxx-xxxx-xxxx”) .build(); StringWriter json = new StringWriter(); try (JsonWriter writer = Json.createWriter(json)) { writer.writeObject(customer); } json.toString(); { “name”:”Norito Agetsuma”, “mailAddr”:”test@gmail.com”, “phone”:”xxx-xxxx-xxxx” }
  • 29.
    JSON-P 1.1 JavaEE 8 - JSON Patch • JSONデータの一部を置き換える仕組み– RFC6902 • HTTP “PATCH” と組み合わせて差分更新に使う • “PUT”は対象URLのリソース全体を置き換えることを示す • “POST”はリソースの新規作成に用途を絞る http://xxx/user/1 { “name”:”n-agetsuma” “state”:”chiba tokyo” “phone”:”xxx-xxxx-xxxx” } 一部を変更したい 新規項目を追加したい
  • 30.
    JSON-P 1.1 HTTP“PATCH” メソッドで差分適用 PATCH /user/1 HTTP1.1 Content-Type: application/json-patch [ {“op”:”replace”, “path”:”/state”, “value”:”tokyo”}, {“op”:”add”, “path”:”/phone”, “value”:”xxx-xxxx-xxxx”} ] { “name”:”Norito Agetsuma” “state”:”Chiba tokyo” “ phone”:”xxx-xxxx-xxxx” ... }
  • 31.
    JSON-P 1.1 JSONPatch - APIのアイディア // パッチ対象とパッチの生成 JsonObject target = Json.createObjectBuilder().add(..).build(); JsonArray patch = Json.createArrayBuilder() …build(); // パッチからJsonPatch の生成 JsonPatch jsonpatch = Json.createPatch(patch); // パッチの適用と結果取得 JsonArray result = jsonpatch.apply(target);
  • 32.
    CDI 2.0 JSR365https://jcp.org/en/jsr/detail?id=365
  • 33.
    CDI 2.0 非同期イベント機能の導入 @Inject Event<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) {..} 通知 通知する側 通知される側 通知される側
  • 34.
    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の標準化
  • 35.
    Java EE ManagementAPI 2.0 JSR TBD : REST管理APIの標準化
  • 36.
    Java EE ManagementAPI 2.0 REST APIによる監視・デプロイの標準化 • J2EE Management 1.1 - JSR77 の更新 • RESTT API による管理 • 既にJSR77で定義されているJava EE管理モデルに準拠 • SSE - Server Sent Event による通知モデルの定義 • MEJB API - リモートEJB によるアクセス仕様のオプション化 • REST APIによるアプリケーションのデプロイ
  • 37.
    Java EE ManagementAPI 2.0 J2EE管理対象オブジェクトのモデル抜粋 http://download.oracle.com/otn-pub/jcp/j2ee_management-1_1-mrel-eval-oth-JSpec/j2ee_management-1.1-mrel-spec.pdf
  • 38.
    Java EE Security1.0 JSR TBD : セキュリティ関連機能の再構築
  • 39.
    Java EE Security1.0 詳細についてはこれから検討が始まる予定 • 検討スコープを整理中 • ユーザ管理 • ロールマッピング • RESTの認証・認可... • CDIインターセプタによる認可制御
  • 40.
    Java EE 8Schedule Final仕様リリースは2016年予定 • Early Draft 2015/Q1 アイディアが出始める • Public Review 2015/Q3 大分内容が固まってくる • Proposed Final Draft 2015/Q4 仕様によってはFinal Draftで複数回の修正あり • Final Release 2016/Q3
  • 41.
    GlassFish 5 JavaEE 8もRIはGlassFish GlassFish5に乞うご期待