How to prevent runtime type erasure using GenericEntity in Jakarta REST in Jakarta EE 10

Jakarta EE

Java generics is a great feature that allows you to have compile time checks for generics. However, due to historical reasons of backward compatibility, type information for generics is erased at runtime. A lot of the time this shouldn’t be of much concern. But there are a few cases where type information is needed at runtime for some kind of decision. 

One such situation is in Jakarta REST when the jakarta.ws.rs.core.Response object is used to return a generic collection of a specific type. For example the code below shows the creation and return of a Response object that has a list of HelloEntity as the return payload to the client. 

List<HelloEntity> helloEntities = greetingService.loadSampleEntities();
return Response.ok(helloEntities).build();

The problem with the above is that type erasure removes the type from the list such that at runtime the passed list becomes List<?> instead of the specific Java type HelloEntity passed at compile time. For a lot of cases this may not be of concern. But if you have a complex or very custom case where the generic information is needed at runtime to fetch the exact  jakarta.ws.rs.ext.MessageBodyWriter, then this could be a very big problem. 

To get around this problem, the Jakarta API has the jakarta.ws.rs.core.GenericEntity<T> wrapper for wrapping generic types, as shown in the code snippet below.



List<HelloEntity> helloEntities = greetingService.loadSampleEntities();
GenericEntity<List<HelloEntity>> entity = new GenericEntity<>(helloEntities) {};
return Response.ok(entity).build();

The original HelloEntity list is wrapped in a GenericEntity created as an anonymous class. This new object is then passed as the entity of the returned Response object. With this construct, the typed information of the original helloEntities list is not lost and can be retrieved at runtime. So next time you need to maintain generic information at runtime in Jakarta REST, give GenericEntity a look.

Found this useful? Try more of ourJakarta EEcontent:

Comments (0)

Post a comment

Your email address will not be published. Required fields are marked *

Payara needs the contact information you provide to us to contact you about our products and services. You may unsubscribe from these communications at any time. For information on how to unsubscribe, as well as our privacy practices and commitment to protecting your privacy, please review our Legal & Privacy Policy.

Related Posts

Payara promotional graphic showing transition from Spring to Jakarta EE, including technology logos, a code icon and arrows leading from Spring to Jakarta EE. 6 minutes
Jakarta EE

From Spring Boot To Jakarta EE 11: How Payara Starter Eases The Transition

If you’ve been living in the Spring ecosystem, you’re used to fast project setup. Spring Initializr gives you a […]

The Imperative for Legacy Java Modernization in Banking Cover 2 minutes
Security

The $57 Billion Problem: Why Banking’s Java Legacy Crisis Demands Immediate Action

How outdated Java systems are draining budgets and throttling innovation across financial services? Let’s dig in in this blog […]

Graphic promoting the Jakarta EE Agentic AI Project by Payara Community. The design shows a laptop screen with a central icon of a person wearing headphones and using a laptop, surrounded by sparkles. The background features blue ocean-themed elements with coral and small fish. Logos for Jakarta EE and Payara Community appear at the top. 3 minutes
Community

Announcing the Jakarta Agentic AI Project

Exploring the Future of AI with the Jakarta EE Community At Payara, we’re passionate about pushing the boundaries of […]