Java EE 8 - February 2017 update
-
Upload
david-delabassee -
Category
Software
-
view
1.424 -
download
0
Transcript of Java EE 8 - February 2017 update
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JavaEE8–What’scoming?February2017
DavidDelabassee@delabasseeOracle
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
SafeHarborStatementThefollowingisintendedtooutlineourgeneralproductdirecPon.ItisintendedforinformaPonpurposesonly,andmaynotbeincorporatedintoanycontract.Itisnotacommitmenttodeliveranymaterial,code,orfuncPonality,andshouldnotberelieduponinmakingpurchasingdecisions.Thedevelopment,release,andPmingofanyfeaturesorfuncPonalitydescribedforOracle’sproductsremainsatthesolediscrePonofOracle.
2
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JavaEEAPIs-BackboneofLeadingOpenSourceProjects
3
JavaEEContainers
Microservices WebContainers
WebFrameworks
PaaSREST
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 4
The reports of my death
aregreatlyexaggerated.JavaEE
“
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 5
Lifeisnotaquietriver...“CharlesRegimbeau
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 6
CommunitySurvey
h`ps://blogs.oracle.com/theaquarium/entry/java_ee_8_community_survey2
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JavaEE8
7
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JAX-RS2.1
• ReacPveClientAPI• Server-sentevents• Non-blockingI/Oinproviders(filters,interceptors…)• HypermediaAPIenhancements• IntegraPonwithotherJSRsandframeworks
8
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 9
JAX-RS2.0
Clientclient=ClientBuilder.newClient();
Stringname=client.target("http://example.com/api/hello").request(MediaType.TEXT_PLAIN).get(String.class);//...
client.close();
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 10
JAX-RS2.0
//http://example.com/api/read/doe?dpt=1
WebTargetmyResource=client.target("http://example.com/api/read").path("{user}").resolveTemplate("user","joe").queryParam("dpt","1");
Responseresponse=myResource.request(...).get();
//...
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 11
JAX-RS2.0
Clientclient=ClientBuilder.newClient();
WebTargetmyResource=client.target("http://example.com/api/read");
Future<String>response=myResource.request(MediaType.TEXT_PLAIN).async().get(String.class);
//...
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 12
JAX-RS2.0
WebTargetmyResource=client.target("http://example.com/api/read");
Future<Customer>fCustomer=myResource.request(MediaType.TEXT_PLAIN).async().get(newInvocationCallback<Customer>(){
@Overridepublicvoidcompleted(Customercustomer){//workonthecustomer}
@Overridepublicvoidfailed(Throwablethrowable){//Oops!}
});
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 13
JAX-RS2.0
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 14
JAX-RS2.0destination.path("recommended").request().header("Rx-User","Async").async().get(newInvocationCallback<List<Destination>>(){@Overridepublicvoidcompleted(finalList<Destination>recommended){finalCountDownLatchinnerLatch=newCountDownLatch(recommended.size());finalMap<String,Forecast>forecasts=Collections.synchronizedMap(newHashMap<>());for(finalDestinationdest:recommended){forecast.resolveTemplate("dest",dest.getDestination()).request().async().get(newInvocationCallback<Forecast>(){@Overridepublicvoidcompleted(finalForecastforecast){forecasts.put(dest.getDestination(),forecast);innerLatch.countDown();}
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 15
JAX-RS2.0…@Overridepublicvoidfailed(finalThrowablethrowable){innerLatch.countDown();}});}
try{if(!innerLatch.await(10,TimeUnit.SECONDS)){//timeout}}catch(finalInterruptedExceptione){//Ooops,interrupted!}
//Continuewithprocessing…}
@Overridepublicvoidfailed(finalThrowablethrowable){//Recommendationerror}});
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 16
JAX-RS2.1
//JAX-RS2.1CompletionStage<Response>csResponse=ClientBuilder.newClient().target("http://example.com/api").request().rx().get();
Future<Response>fResponse=ClientBuilder.newClient().target("http://example.com/api").request().async().get();
Responseresponse=ClientBuilder.newClient().target("http://example.com/api").request().get();
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 17
JAX-RS2.1
CompletionStage<String>cs1=client.target("http://partner.us/api").request().rx().get(String.class);CompletionStage<String>cs2=client.target("http://supplier.be/api").request().rx().get(String.class);//getbothresponsesinaList(whentheyareavailable)CompletionStage<List<String>>listCompletionStage=cs1.thenCombine(cs2,List::of);
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JAX-RS2.1
• Server-SentEvents– Persistent,one-waycommunicaPonchannel– Textprotocol,specialmediatype"text/event-stream"– ServercansendmulPplemessages(events)toaclient– Cancontainid,name,commentretryinterval– Supportedinallmodernbrowsers
18
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JAX-RS2.1
19
SSE–Serversideclasses
• OutboundSseEvent– OutboundSSErepresentaPon
• SseEventOutputextendsFlow.Subscriber<OutboundSseEvent>– OutboundSSEstream– ApplicaPoncanwriteeventstoit,checkitsstateandcloseit
• SseBroadcasterextendsFlow.Publisher<OutboundSseEvent>– UsedtoworkwithmulPpleSseEventOutputinstances
• SseContext– Injectablefactoryfortheaboveclasses
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JAX-RS2.1
20
SSE–Clientsideclasses
• InboundSseEvent– InboundServerSentEvent– SimilartoOutboundSseEvent
• SseEventInput– Low-levelwayforaccessingServerSentEventsstream
• SseEventSourceextendsFlow.Publisher<InboundSseEvent>– UsedforsubscribingtoServerSentEventstreams
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 21
JAX-RS2.1//server-sideinit@InjectSseContextsseContext;
SseBroadcastersseBroadcaster=sseContext.newBroadcaster();
sseBroadcaster.onException((o,e)->{e.printStackTrace();});
sseBroadcaster.onClose(...);
@GET@Path("sse")@Produces(MediaTypes.SERVER_SENT_EVENTS)publicSseEventOutputitemEvents(...){SseEventOutputeventOutput=sseContext.newOutput();//...returneventOutput;}
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 22
JAX-RS2.1
//...finalOutboundSseEvent=osesseContext.newEvent().id(...).data(...).comment(...).build();
eventOutput.write(ose);
sseBroadcaster.subscribe(eventOutput);sseBroadcaster.broadcast(ose);
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 23
JAX-RS2.1privatefinalWebTargettarget=ClientBuilder.newClient().target("http://host/sse");privateSseEventSourceeventSource;publicvoidconnect(Consumer<String>dataConsumer){eventSource=SseEventSource.target(target).open(es->es.subscribe(newFlow.Subscriber<InboundSseEvent>(){
@OverridepublicvoidonNext(finalInboundSseEventitem){dataConsumer.accept(item.readData());}
//onSubscribe,onError,onComplete
}));}
//...
eventSource.close();
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JSON-P1.1
• UpdateJSON-Pspectostaycurrentwithemergingstandards– RFC7159-TheJavaScriptObjectNotaPon(JSON)DataInterchangeFormat– RFC6901–JSONPointer– RFC6902–JSONPatch– RFC7396–JSONMergePatch
• AddediPng/transformaPonoperaPonstoJsonObjectandJsonArray• AddJSONCollectors• BigJSONsupport
24
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JSON-P1.1
• JSON-Pointer–IETFRFC6901• StringsyntaxforreferencingaJSONvalue
E.g."/0/user/address"
25
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JSON-P1.1
26
[{"name":"Duke","gender":"M","phones":{"home":"555-123-456","mobile":"555-321-456"}},{"name":"Jane","gender":"F","phones":{"mobile":"555-999-111"}}]
JsonArraycontacts=…JsonPointerpointer=newJsonPointer("/0/name");JsonValuevalue=pointer.getValue(contacts);
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JSON-P1.1
• JSON-Pointer–IETFRFC6901• StringsyntaxforreferencingaJSONvalue– E.g."/0/user/address”
• Methods– getValue(),add(),replace(),remove()
27
JsonPointerpointer=newJsonPointer("/0/name");JsonArrayresult=pointer.replace(contacts,Json.createValue("Joe"));
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JSON-P1.1
• JSON-Patch–IETFRFC6902• PatchisaJSONdocument– Arrayofobjects/operaPonsformodifyingaJSONdocument– Add,replace,remove,move,copy,test
28
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 29
JSON-P1.1
[{"op":"replace","path":"/0/phones/mobile","value":"650-111-2222"},{"op":"remove","path":"/1"}]
[{"name":"Duke","gender":"M","phones":{"home":"650-123-4567","mobile":"650-234-5678"}},{"name":"Jane","gender":"F","phones":{"mobile":"707-555-9999“}}]
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 30
JSON-P1.1
[{"op":"replace","path":"/0/phones/mobile","value":"650-111-2222"},{"op":"remove","path":"/1"}]
[{"name":"Duke","gender":"M","phones":{"home":"650-123-4567","mobile":"650-234-5678"}},{"name":"Jane","gender":"F","phones":{"mobile":"707-555-9999“}}]
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 31
JSON-P1.1
[{"op":"replace","path":"/0/phones/mobile","value":"650-111-2222"},{"op":"remove","path":"/1"}]
[{"name":"Duke","gender":"M","phones":{"home":"650-123-4567","mobile":"650-111-2222"}},{"name":"Jane","gender":"F","phones":{"mobile":"707-555-9999“}}]
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 32
JSON-P1.1
[{"op":"replace","path":"/0/phones/mobile","value":"650-111-2222"},{"op":"remove","path":"/1"}]
[{"name":"Duke","gender":"M","phones":{"home":"650-123-4567","mobile":"650-111-2222"}},{"name":"Jane","gender":"F","phones":{"mobile":"707-555-9999“}}]
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 33
JSON-P1.1
[{"op":"replace","path":"/0/phones/mobile","value":"650-111-2222"},{"op":"remove","path":"/1"}]
[{"name":"Duke","gender":"M","phones":{"home":"650-123-4567","mobile":"650-111-2222"}},{"name":"Jane","gender":"F","phones":{"mobile":"707-555-9999“}}]
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 34
JSON-P1.1
[{"op":"replace","path":"/0/phones/mobile","value":"650-111-2222"},{"op":"remove","path":"/1"}]
[{"name":"Duke","gender":"M","phones":{"home":"650-123-4567","mobile":"650-111-2222"}}]
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 35
JSON-P1.1
JsonArraytarget=…;JsonArraypatch=…;
JsonPatchjsonPatch=newJsonPatch(patch);
JsonArrayresult=jsonPatch.apply(target);
JsonPatchBuilderbuilder=newJsonPatchBuilder();JsonArrayresult=builder.add("/Joe/phones/office","1234-567").remove("/Amy/age").apply(target);
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 36
JSON-P1.1
OrignalPatchResult
{"a":"b"}{"a":"c"}{"a":"c"}
{"a":"b"}{"b":"c"}{"a":"b","b":"c"}
{"a":"b"}{"a":null}{}
{"a":"b",{"a":null}{"b":"c"}"b":"c"}
…
• JSON-MergePatch–IETFRFC7386
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 37
JSON-P1.1
• JSON-MergePatch–IETFRFC7386
JsonObjectcontact=…;//ThetargettobepatchedJsonObjectpatch=…;JsonValueoutput=JsonMergePatch.mergePatch(target,patch);
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 38
JSON-P1.1
• JSON-Patch&JSON-MergePatchDiff
JsonValueoutput=JsonMergePatch.diff(original,target);JsonArraydiff=JsonPatch.diff(original,target);
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 39
JSON-P1.1
JsonArraycars=...;
JsonArrayaudis=cars.getValuesAs(JsonObject.class).stream().filter(x->"Audi".equals(x.getString("brand"))).map(x->(x.getString("serial"))).collect(Collector.of(()->Json.createArrayBuilder(),(builder,value)->builder.add(value),(builder1,builder2)->builder1.add(builder2),builder->builder.build()));
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 40
JSON-P1.1
JsonArraycars=...;
JsonArrayaudis=cars.getValuesAs(JsonObject.class).stream().filter(x->"Audi".equals(x.getString("brand"))).map(x->(x.getString("serial")).collect(JsonCollectors.toJsonArray());
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JSON-B1.0
• JAXB-likeAPItomarshal/unmarshalJavaobjectsto/fromJSONdocuments• DefaultmappingbetweenclassesandJSON• CustomizaPonAPIs– AnnotaPon(@JsonbProperty,@JsonbNillable)– RunPmeconfiguraPonbuilder
• Allowstoswapproviders• NaturalfollowontoJSON-P–closestheJSONsupportgap
41
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 42
JSON-B1.0
[{"brand":"Apple","model":"iPhone7","stock":1},{"brand":"Samsung","model":"GalaxyNote7","stock":666}]
Phonephone1=newPhone();phone1.setBrand("Apple");phone1.setModel("iPhone7");phone1.setStock(1);…List<Phone>inventory=newArrayList<>();inventory.add(phone1);inventory.add(phone2);Jsonbjsonb=JsonBuilder.create();Stringstock=jsonb.toJson(inventory);
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 43
publicclassCustomer{privateintid;
@JsonbProperty("name")privateStringfirstName;
}publicclassCustomer{publicintid;publicStringfirstName;
@JsonbProperty("name")privateStringgetFirstName(){returnfirstName;}
}
JSON-B1.0CustomizaPons
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JSON-B1.0CustomizaPons
• Namingstrategies– IDENTITY:myProp– LOWER_CASE_WITH_DASHES:my-prop
– LOWER_CASE_WITH_UNDERSCORES:my_prop– UPPER_CAMEL_CASE:MyProp– UPPER_CAMEL_CASE_WITH_SPACES:MyProp
– CASE_INSENSITIVE:myprop– OracustomimplementaPon
44
• Propertyordering– Any,Lexicographical,Reverse
• BinaryDataStrategies– Base64,Base64URL,Byte
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JSON-B1.0CustomizaPons
• Propertynaming• Propertyordering• Propertytoignore• Nullhandling• CustominstanPaPon
45
• Fieldsvisibility• Date/NumberFormats• BinaryEncoding• Adapters• ...
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 46
JSON-B1.0CustomizaPons
Jsonbjsonb=JsonbBuilder.create();//Ordering,namingstrategy,encoding,Locale,…
JsonbConfigconfig=newJsonbConfig().withFormatting(true).withAdapters(newCarAdapter());
Jsonbjsonb=JsonbBuilder.create(config);Jsonbjsonb=JsonBuilder.newBuilder("myProvider");
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
Servlet4.0
• SupportforHTTP/2– Request/responsemulPplexing– Serverpush– UpgradefromHTTP1.1
• CompaPbilitywithlatestHTTP1.1RFCs• Smallercommunity-requestedimprovements(JIRAissues)
47
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
HTTP/2
• BinaryFramingoversingleTCPconnecPon• Request/ResponsemulPplexing• StreamPrioriPzaPon• ServerPush• UpgradefromHTTP1.1• HeaderCompression• PreserveHTTPsemanPc• FlowControl
48
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
Servlet4.0
49
PushBuilderbuilder=baseRequest.getPushBuilder();
builder.addHeader("X-Pusher",…);
builder.path(aResource).etag(associated._etag).lastModified(associated._lastModified).push();
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JSF2.3
• Be`erCDIIntegraPon– Waymorethingsareinjectable– Finallymarkinglegacymanagedbeansasdeprecated
• JavaTimesupport• WebSocketIntegraPon• AjaxMethodInvocaPon• ClassLevelBeanValidaPon• UIDataandUIRepeatimprovements
50
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
CDI2.0
• DefinebehaviorofCDIoutsideofaJavaEEcontainer• APItobootstrapaCDIcontainerinJavaSE• Specsplitinto3parts:– CDICore– CDIforJavaSE– CDIforJavaEE
• ApplyInterceptoronProducer• Observersordering• Asynchronousevents
51
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
CDI2.0
52
@InjectEvent<PaymentEvent>debitEvent;//producerdebitEvent.fire(somePayload);
//consumerpublicvoidanObesrver(@ObservesPayloadp){…}
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
CDI2.0
53
//consumerApublicvoidanObesrver(@ObservesPayloadp){…}//consumerBpublicvoidanotherObesrver(@ObservesPayloadp){…}
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
CDI2.0
54
//consumerApublicvoidanObesrver(@Observes@Priority(10)Payloadp){…}//consumerBpublicvoidanotherObesrver(@Observes@Priority(20)Payloadp){…}
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
CDI2.0
55
@InjectEvent<PaymentEvent>debitEvent;//asyncproducerdebitEvent.fireAsync(somePayload);
//asyncconsumerpublicvoidanObesrver(@ObservesAsyncPayloadp){…}
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
BeanValidaPon2.0
• EmbraceJavaSE8– SupportfornewDate/TimeAPI– ConstraintsappliedtocollecPonelements– OpPonalwrappers– RepeatableannotaPons
• Introducenewconstraints– E.g.@NotEmpty,@NotBlank
• AddiPonalfeaturesrequestedfromcommunity
56
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
BeanValidaPon2.0
57
List<@NotNull @Email String> emails;
String @NotNull @Email[] emails;
Map<@Valid Customer, @Valid Address> primaryAddressByCustomer;
Optional<@Past LocalDate> getRegistrationDate();
@ZipCode(countryCode = "fr", groups = Default.class, message = "unvalid zip") !@ZipCode(countryCode = "fr", groups = SuperUser.class, message = "zip nok…") !private String zipCode;
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
SecurityAPIforJavaEE
• IdenPtyStore– StandardizeapplicaPon-accessibleIdenPtyStore – ValidateCaller'scredenPalsandaccessingrelatedidenPtya`ributes• UsedbyanauthenPcaPonmechanism(e.g.JASPIC)
• AuthenPcaPonMechanism– SimplifyapplicaPon-accessibleauthenPcaPonmechanisms
• SecurityContext– Standardizeapla{orm-wideSecurityContext • ProgrammaPcaccesspoint
58
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
Wrap-up
59
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JavaEE8
60
Connector JAXBJSPDebugging
ManagedBeansJSPConcurrencyEE Interceptors JAX-WS WebSocket
BeanValidaPon JASPIC ServletJMS JTADeployment
Batch JACCDependencyInjecPon JAXR JSTL Management
CDI EJB JAX-RPC WebServicesJSF JPA
CommonAnnotaPons EL JAX-RS WebServices
MetadataJavaMail
CDI
JSON-B Security
BeanValidaPon
JSF
JAX-RS JSON-P
Servlet
JSP
(*)MRsReleasesnotlisted
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 61
JavaEE8-StatusSpecificaKons EarlyDraM PublicDraMCDI2.0–JSR365 OngoingJavaEE8–JSR366 2nddra}JSON-B1.0–JSR367 Done!Servlet4.0–JSR369 OngoingJAX-RS2.1–JSR370 ExpectedQ1 ExpectedQ2JSF2.3–JSR372 OngoingJSON-P1.1–JSR374 OngoingSecurity1.0–JSR375 ExpectedQ1BeansValidaPon2.0–JSR380 ExpectedQ1
MVC–JSR371:SpecLeadtransferinprogress
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|
JavaEE8-Summary• Workinprogress– H22017FinalRelease
• Contribute!– AdoptAJSR• h`ps://community.oracle.com/community/java/jcp/adopt-a-jsr
• OpenSourceReferenceImplementaPons– GlassFish5,Jersey…
• h`p://glassfish.org
62
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 63
SomePmesyouhavetotakeastepbacktomoveforward.“
ErikaTaylor
Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 64
Tack!