Quarkus - Demo Application
Creating first Quarkus app
Let's create an App which will recommend random quotes from a database. To start , let us generate an app using maven CLI .
mvn io.quarkus.platform:quarkus-maven-plugin:2.10.0.Final:create \
-DprojectGroupId=dev.pallav \
-DprojectArtifactId=quotes\
-Dextensions="resteasy-reactive"
cd quotes
To run the above project we can run the simple command and it will start the server at 8080
port.
./mvnw quarkus:dev
The above step has generated a GreetingResource as default which has an endpoint /hello
GreetingController has below code .
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello from RESTEasy Reactive";
}
}
- @Path is annotation for for describing URL path
- @GET - invokes the GET endpoint
- @Produces - Response type, here its a plain text, other example could be JSON or XML
We can use postman or curl to access the endpoint and validate if it works.
[codingsaint@fedora ~]$ curl http://localhost:8080/hello
Hello from RESTEasy Reactive
This showed how easy was it to create a working project with Quarkus.
Injection of the service
Let us add more details. We will create QuotesResource will generate random quotes , to start with we will have 5 quotes and let it be picked randomly. We will evolve our system to learn event driven microservices. Our Quote object will be a simple record with author and quote
package dev.pallav.models;
public record Quote(String author, String quote) {
}
Let's create QuoteService
package dev.pallav.service;
import dev.pallav.models.Quote;
import javax.enterprise.context.ApplicationScoped;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
@ApplicationScoped
public class QuoteService {
private List<Quote> quotes= new ArrayList<>();
public QuoteService(){
Quote q1= new Quote("Yoda", "Do, or do not. There is no try");
Quote q2= new Quote("Ralph Waldo Emerson", "Happiness is a perfume you cannot pour on others without getting a few drops on yourself");
Quote q3= new Quote("Oliver Holmes", "A man may fulfil the object of his existence by asking a question he cannot answer, and attempting a task he cannot achieve.");
Quote q4= new Quote("Napoleon Hill", "Opportunity often comes disguised in the form of misfortune, or temporary defeat");
Quote q5= new Quote("Mahatma Gandhi", "Our greatness lies not so much in being able to remake the world as being able to remake ourselves");
quotes.addAll(List.of(q1,q2,q3,q4,q5));
}
public Quote quote(){
Random random= new Random();
return quotes.get(random.nextInt(quotes.size()));
}
}
@ApplicationScoped
- Let container know that bean is application scopedQuoteService
constructor - initialize List of Quotes acting as temporary databasequote
method pick a random quote Since we want a RESTful endpoint with json output , let's add jackson support with dependency in pom.xml .
<!-- Jackson -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-reactive-jackson</artifactId>
</dependency>
Not we can create the endpoint and invoke QuoteService
to get a random quote.
package dev.pallav;
import dev.pallav.models.Quote;
import dev.pallav.service.QuoteService;
import javax.print.attribute.standard.Media;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("quote")
public class QuoteResource {
private final QuoteService quoteService;
public QuoteResource(QuoteService quoteService) {
this.quoteService = quoteService;
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public Quote quote(){
return quoteService.quote();
}
}
- You can see the
MediaType.APPLICATION_JSON
with@Produces
annotation to let endpoint produce a JSON response Let's run the application and validate our service, We can curl to validate or use any client as postmancurl http://localhost:8080/quote {"author":"Ralph Waldo Emerson","quote":"Happiness is a perfume you cannot pour on others without getting a few drops on yourself"}
In this article we created a Sample Quarkus Application and learn how to inject (Constructor Injection) a service . In next article we will add a database support and a POST endpoint to add quotes at database.