Jakarta EE 10 and Beyond
[Your Name]
[Your Credentials]
[Your Contact]
[Your Social Media]
Jakarta EE
The Importance of Jakarta EE
2022 Jakarta EE Developer Survey: https://outreach.eclipse.foundation/jakarta-ee-developer-survey-2022
Jakarta EE Evolution
JPE
J2EE 1.2
Servlet, JSP, EJB, JMS
J2EE 1.3
CMP, JCA
J2EE 1.4
JAX-WS
Java EE 5
EJB 3, JPA, JSF, JAXB, JAX-WS
Java EE 7
WebSocket, JSON, Concurrency, Batch, pruning
Java EE 8
HTTP/2, SSE, Security, pruning
Java EE 6
Profiles, CDI, JAX-RS, Bean Validation
Jakarta EE 8
Open-source governance
Jakarta EE 9.x
Namespace
transition
Jakarta EE 10
New features, updates
A Lively Ecosystem
Jakarta EE 9/9.1
Ambassadors’ Jakarta EE 11 Contribution Guide
Jakarta EE 10 in Context
Made it! On the way Gap
Jakarta EE 10 Themes
Jakarta EE 10 at a Glance
Authorization 2.1
Activation 2.1
Batch 2.1
Connectors 2.1
Mail 2.1
Messaging 3.1
Enterprise Beans 4.0
RESTful Web Services 3.1
JSON Processing 2.1
JSON Binding 3.0
Annotations 2.1
CDI Lite 4.0
Interceptors 2.1
Dependency Injection 2.0
Servlet 6.0
Server Pages 3.1
Expression Language 5.0
Debugging Support 2.0
Standard Tag Libraries 3.0
Faces 4.0
WebSocket 2.1
Enterprise Beans Lite 4.0
Persistence 3.1
Transactions 2.0
Managed Beans 2.0
CDI 4.0
Authentication 3.0
Concurrency 3.0
Security 3.0
Bean Validation 3.0
Updated
Not Updated
New
Platform
Web Profile
Core Profile
Jakarta Concurrency
@ManagedExecutorDefinition
@ContextServiceDefinition(
name = "java:app/concurrent/AppContextOnly",
propagated = APPLICATION,
cleared = { TRANSACTION, SECURITY },
unchanged = ALL_REMAINING)
@ManagedExecutorDefinition(
name = "java:app/concurrent/MyExecutorService",
context = "java:app/concurrent/AppContextOnly",
maxAsync = 5)
...
@Resource(name = "java:app/concurrent/MyExecutorService")
private ManagedExecutorService executor;
@Asynchronous
@Asynchronous(executor = "java:app/concurrent/MyExecutorService")
public CompletableFuture<Confirmation> processPayment(Order order) {
try {
...
Confirmation status = ...;
return Asynchronous.Result.complete(status);
} catch (...) {
throw new CompletionException(x);
...
}
paymentService
.processPayment(order)
.thenAccept(
confirmation -> System.out.println(confirmation));
Jakarta REST
Bootstrap API
SeBootstrap.Instance instance = SeBootstrap.start(new Application() {
@Override
public Set<Class<?>> getClasses() {
return Collections.singleton(GreetingResource.class);
}
}).toCompletableFuture().get();
try (Client client = ClientBuilder.newClient()) {
final Response response = client.target(instance.configuration()
.baseUriBuilder().path("greet/World"))
.request().get();
System.out.println(response.readEntity(String.class));
}
instance.stop().toCompletableFuture().get();
multipart/form-data
@Path("/apply")
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response applyForJob(
@FormParam("name") String name,
@FormParam("recentPhoto") EntityPart photo,
@FormParam("resume") EntityPart resume) {
processApplication(name,
photo.getMediaType(), photo.getContent(),
resume.getMediaType(), resume.getContent());
return Response.ok("Application received").build();
}
Jakarta Security
@OpenIdAuthenticationDefinition
@OpenIdAuthenticationDefinition(
providerURI = "https://accounts.google.com",
clientId = "${config.clientId}",
clientSecret = "${config.clientSecret}",
redirectURI = "${baseURL}/callback",
redirectToOriginalResource = true
)
Jakarta Persistence
UUID Key
@Entity
public class Item {
@Id @GeneratedValue(strategy=GenerationType.UUID)
private java.util.UUID id;
private String description;
...
}
Jakarta Faces
<context-param>
<param-name>jakarta.faces.AUTOMATIC_EXTENSIONLESS_MAPPING</param-name>
<param-value>true</param-value>
</context-param>
<h:inputText type="email"/>
<h:inputFile value="#{bean.files}" multiple="true" accept="image/jpeg,image/png,image/gif"/>
<f:websocket channel="push" onerror="errorListener" onclose="closeListener"/>
Pure Java Faces View
@View("/hello.xhtml") @ApplicationScoped
public class Hello extends Facelet {
...
HtmlForm form = components.create(HtmlForm.COMPONENT_TYPE);
body.getChildren().add(form);
HtmlOutputText message = components.create(HtmlOutputText.COMPONENT_TYPE);
form.getChildren().add(message);
HtmlCommandButton actionButton = components.create(HtmlCommandButton.COMPONENT_TYPE);
actionButton.addActionListener(e -> message.setValue("Hello, World"));
actionButton.setValue("Do action");
form.getChildren().add(actionButton);
...
}
Core Profile
Possible
Updated
Not Updated
New
RESTful Web Services 3.1
JSON Processing 2.1
JSON Binding 3.0
Annotations 2.1
CDI Lite 4.0
Interceptors 2.1
Dependency Injection 2.0
CDI
Other Changes
Try it Now!
Jakarta EE 11 Themes
Ways of Contributing
Summary
Resources