This document provides a summary of the presentation "Rapid Development Tools for Java EE 8" given by Mert Çalışkan and Gaurav Gupta at JavaOne 2017. The presentation provides an overview of the new features in Java EE 8, including JAX-RS 2.1, CDI 2.0, Bean Validation 2.0, JSON-B, JPA 2.2, and the Java Security API 1.0. It then demonstrates tools for developing Java EE 8 applications more productively, such as the Jeddict modeler, Dynamic Code Evolution Virtual Machine, Payara tools in NetBeans, and Maven plugins. The presentation concludes with a question and answer section.
2. Mert Çalışkan
Payara Developer
Java EE / Spring Consultant
Author of PrimeFaces Cookbook
Author of Beginning Spring book
Part-time Lecturer
@mertcal
Gaurav Gupta
Payara Developer
NetBeans Dream Team
Jeddict Creator ( jeddict.github.io )
@jGauravGupta , @ImJeddict
3. Agenda
- What’s new with Java EE 8? : Quick overview
- Java EE 8 application generation w/ Jeddict
- Java EE Tools : To boost your productivity
- Q&A
@jGauravGupta
4. What’s new with Java EE8?
Java EE8 is released on Sep 24, 2017.
● JAX-RS 2.1 (Jersey 2.26)
● CDI 2.0 (Weld 3.0.0.Final)
● Bean Validation 2.0 (Hibernate Validator 6.0.2.Final)
● JSON-B (Yasson 1.0)
● JPA 2.2 (EclipseLink 2.7.0)
● Java Security API 1.0 (Soteria 1.0)
Checkout https://github.com/javaee-samples/javaee8-samples for details on the
examples
@mertcal
5. ● Reactive Client API
● JSON-B support
● Server Sent Events (SSE)
JAX-RS 2.1 (JSR 370)
@mertcal
6. ● With JAX-RS 2.0, we had asynchronous invoker approach as:
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080/service-url");
Invocation.Builder builder = target.request();
Future<MyClass> futureResult = builder.async().get(MyClass.class);
System.out.println(futureResult.get());
client.close();
Previously on JAX-RS 2.0
@mertcal
7. ● Previous scenario can also be implemented with InvocationCallback<T>
but…
Client client = ClientBuilder. newClient();
WebTarget target = client.target( "http://localhost:8080/service-url");
Invocation.Builder builder = target.request();
builder.async().get( new InvocationCallback<MyClass>() {
@Override
public void completed(MyClass t) {}
@Override
public void failed(Throwable throwable) {}
});
Previously on JAX-RS 2.0
@mertcal
8. ● Reactive Client API to the rescue.
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080/service-url");
Invocation.Builder builder = target.request();
CompletionStage<Response> response = builder.rx().get();
response.thenAcceptAsync(res -> {
MyClass t = res.readEntity(MyClass.class);
System.out.println(t);
});
JerseyCompletionStageRxInvoker
CompletionStage<Response>
With JAX-RS 2.1
@mertcal
11. ● Server Sent Events (SSE) is a mechanism that allows server to
asynchronously push data from the server to client once the client-server
connection is established by the client.
● It’s mostly like Long-Pooling but it’s not :) and it’s not WebSockets either.
● Implementations already provided it with JAX-RS 2.0 but there was no standard
API. With JAX-RS 2.1, API is created under javax.ws.rs.sse
JAX-RS 2.1
@mertcal
12. @Path("/temperature")
public class TemperatureResource {
private final OutboundSseEvent.Builder sseEventBuilder;
public TemperatureResource( @Context Sse sse) {
this.sseEventBuilder = sse.newEventBuilder();
}
@GET
@Path("/{city}")
@Produces(MediaType.SERVER_SENT_EVENTS)
public void getCurrentTemperatureStream( @Context SseEventSink eventSink) {
while (true) {
eventSink.send( sseEventBuilder.data(temperature)
.mediaType(MediaType. APPLICATION_JSON_TYPE).build());
Thread. sleep(1000);
}
}
}
"text/event-stream"
1
2
3
4
JAX-RS 2.1
@mertcal
13. CDI 2.0 (JSR 365)
- SE Support - It’s possible to use CDI outside of Java EE
- Ordering of CDI events - @Priority helps ordering observers
void receive(@Observes @Priority(APPLICATION + 200) String greet) {
this.greet += greet + "2";
}
void receive2(@Observes @Priority(APPLICATION) String greet) {
this.greet = greet + "1";
}
For send(“Welcome”) output will be:
Welcome1Welcome2
@Inject
private Event<String> event;
public void send(String message) {
event.fire(message);
}
@mertcal
14. CompletableStage<MyEvent> eventSent = event.fireAsync( new MyEvent(),
NotificationOptions.ofExecutor(executor));
- Exception in async observer doesn’t break the observer invocation chain.
callMe(@Observes payload) callMe(@ObservesAsync payload)
event.fire(payload) Sync call Not Notified
event.fireAsync(payload) Not Notified Async call
- Long awaited Asynchronous Events Support
- Fire Sync → Observer Sync / Fire Async → Observer Async
CDI 2.0
@mertcal
15. ● Java 8 Date and Time API Support
@Past(message = "must be a past date")
private java.time.Year yearOfBirth;
● Type Annotations
private List<@NotNull @Email String> emails;
private String @NotNull @Email[] emails;
private Map<@Valid Employee, @Valid Address> addressMap = new HashMap<>();
@mertcal
Bean Validation 2 (JSR 380)
16. ● java.util.Optional Support
private Optional<@Past LocalDate> marriageAnniversary;
private Optional<@Size(max = 20) String> name;
● Repeating Annotations
@Max(value = 2000, groups = Default.class)
@Max(value = 5000, groups = GoldCustomer.class)
private long withdrawalAmount;
@mertcal
Bean Validation 2
18. JSON-B (JSR 367)
● Standard solution like JAXB
● Default mapping between classes and JSON
● Customizable
a. Compile time
■ Property naming @JsonbProperty
■ Property ignoring @JsonbTransient
■ Null handling @JsonbNillable
■ Property ordering @JsonbPropertyOrder
■ Date and Number Format @JsonbDateFormat/@JsonbNumberFormat
■ Adapter @JsonbTypeAdapter
b. Runtime configration
■ Configuration builder JsonbConfig
@jGauravGupta
21. JPA 2.2 (JSR 338)
● @Repeatable annotations
● Support Java 8 Date and Time API
● Ability to return stream of query result
● CDI Injection in AttributeConverters
@jGauravGupta
22. JPA 2.1
Container annotation required
@Entity
@NamedQueries({
@NamedQuery(name = "Employee.findAll",
query = "SELECT e FROM Employee e"),
@NamedQuery(name = "Employee.findByName",
query = "SELECT e FROM Employee e WHERE e.name = :name")
})
class Employee {
@Convert(converter=LocalDateConverter.class)
private LocalDate dateOfBirth;
} AttributeConverter
implementation @jGauravGupta
23. JPA 2.2
Container annotation not required
@Entity
@NamedQueries({
@NamedQuery(name = "Employee.findAll",
query = "SELECT e FROM Employee e"),
@NamedQuery(name = "Employee.findByName",
query = "SELECT e FROM Employee e WHERE e.name = :name")
})
class Employee {
@Convert(converter=LocalDateConverter.class)
private LocalDate dateOfBirth;
}
AttributeConverter not required @jGauravGupta
24. JPA 2.2
@Entity
@NamedQuery(name = "Employee.findAll",
query = "SELECT e FROM Employee e")
@NamedQuery(name = "Employee.findByName",
query = "SELECT e FROM Employee e WHERE e.name = :name")
class Employee {
private LocalDate dateOfBirth;
}
@jGauravGupta
25. JPA 2.2
● Stream query results
Stream<Employee> employees =
em.createQuery(“SELECT e FROM Employee”, Employee.class)
.getResultStream();
@jGauravGupta
26. Security API 1.0 (JSR 375)
● Simplify the existing solution
● Enhance the portability
● New APIs
○ HTTPAuthenticationMechanism
○ IdentityStore
○ SecurityContext
@jGauravGupta
39. ● JRE Patch
● Update the code instantly
● DCEVM Dynamic Code Evolution VM http://dcevm.github.io/
STEP-1 : Java installation with the DCEVM engine
STEP-2 : Connect with the Payara Server
STEP-3 : Turn off redeployment of the application on save
STEP-4 : Turn on compile and apply code changes on save
Dynamic Code Evolution
@jGauravGupta
40. ● Bean Archives
● Beans and their properties
○ such as qualifiers, stereotypes and name
● Invocation Trees
● Observers and producers declared by beans
● Interceptors and decorators
● Extensions
● Fired events
Payara CDI Dev Mode : to inspect
@jGauravGupta
41. ● Graph of bean dependency
Payara CDI Dev Mode : to inspect
@jGauravGupta
42. ● Graph of bean archives
Payara CDI Dev Mode : to inspect
@jGauravGupta
43. ● Trace the admin console actions
● Create automation scripts easily
● Helps to investigate
Payara AsAdmin Recorder
@jGauravGupta
44. ● payara-micro-maven-plugin incorporates payara-micro with produced
artifact.
● Offers 3 mojos
○ bundle
○ start
○ stop
● Plugin is available on Maven Central
<groupId>fish.payara.maven.plugins</groupId>
<artifactId>payara-micro-maven-plugin</artifactId>
<version>1.0.0</version>
Maven Plugin
@mertcal