Criando uma aplicação REST com Javalin

Neste post veremos como podemos utilizar o micro framework Javalin para criarmos api rest rapidamente.

O primeiro post sobre o assunto de micro framework foi sobre SparkJava que pode se visto aqui.

Para esse post criaremos um simples hello-world e um CRUD com as seguintes tecnologias :


Introdução ao Javalin

Javalin é um simples micro framework para criação de aplicações web em Java e Kotlin.

Javalin começou como um fork do framework Java e Kotlin do SparkJava, mas rapidamente se transformou em uma reescrita de base influenciada pelo framework JavaScript koa.js.

Javalin implementa as lições aprendidas de trabalhar extensivamente com esses dois frameworks.

se o leitor(a) já tenha experimentado o SparkJava, vai ver que são bem semelhantes e bem fácil de usar .

Como o mesmo objetivo do SparkJava, é usado principalmente para criar APIs REST, mas também oferece suporte a alguns template engines como :

vejamos um simples Hello-World com Javalin :

agora no navegador basta usar http://localhost:7000/ e pronto. Simples não ?

Bem feita essa rápida introdução sobre o framework, vamos partir para construção do nosso projeto .


Criando o Projeto

Crie um projeto Maven com seguinte pom.xml :

após criar o projeto, crie dois arquivo xml na pasta “resource/META-INF” conforme mostrado abaixo :

agora daremos inicio na construção das nossas classes, começaremos pelas classes model :

e uma classe que retorna um código e uma mensagem de resposta de sucesso ou erro durante o uso da api :

agora criaremos uma classe produtora utilizando o CDI, para o EntityManager-JPA :

aqui fizemos o uso de duas anotações do CDI o @Produces e @ApplicationScope :

  • @ApplicationScoped : mantém a instância durante todo o tempo de execução da aplicação. É um escopo que compartilha os objetos para todos os usuários do sistema.
  • @Produces: são apenas métodos que produzem objetos que serão administrados pelo contêiner CDI e injetados em outros objetos.

Com o nosso produtor feito, faremos a parte de persistência de dados utilizando o DeltaSpike-Data.

O DeltaSpike-Data é uma alternativa ao Spring-Data para fazermos nossas persistência de forma simples e objetiva, conforme pode ser visto abaixo :

Agora iremos fazer nossa classe Principal para nosso serviços Rest :

essa é a nossa classe principal para executarmos o nosso serviço, como pode ser visto não foi utilizado o método main como foi demostrado no exemplo do hello-world, neste caso a aplicação vai ser executada pelo contêiner do CDI, então irei explicar algumas partes do código :

Na linha 03 utilizamos a anotação @Inject para injetar a nossa dependência.

Na linha 06 temos um método chamado main contento uma anotação @Observes e uma classe chamada ContainerInitialized, essa anotação ficara observando ou de olho no evento ContainerInitialized, que será disparada quando a classe org.jboss.weld.environment.se.StartMain for chamada ao iniciar nossa aplicação, esse chamada foi declarada no pom.xml na linha 113.

Logo em seguida nas linha 07–10 declaramos uma classe chamada Javalin passando um builder chamando três métodos :

  • para ativar o cors -> enableCorsForAllOrigin()
  • defaultContentType -> para definir o tipo de conteúdo, no caso é JSON
  • por fim chamamos o método start passando como argumento o numero da porta, nosso caso é 8080.

já na linha 11 chamamos o método que faz o uso da Json-B que é implementada na linha 58–63 .

JSON-B é uma camada de ligação padrão para converter objetos Java em / de mensagens JSON. Ele define um algoritmo de mapeamento padrão para conversão de classes Java existentes para JSON, enquanto permite que os desenvolvedores personalizem o processo de mapeamento através do uso de anotações Java.

JSON-B foi incluída no Java EE 8 e é uma alternativa ao Jackson e Gson.

Da linha 13–57 é onde começamos de fato a nossa api Rest .

aqui a gente agrupou nossos endpoints usando os métodos routes () e path ().

Routes () cria uma instância estática temporária do Javalin para que você possa pular o aplicativo .

No método Path() passamos o caminho da nossa api vai acessar via postman ou algo do tipo, isso nome vai ser utilizado por todos os métodos GET, POST, PUT e Delete .

Então na linha 16, fazemos uma chamada para buscar todos os registros do nosso banco de dados e retornando o resultado em Json,para serializar o objeto e definir como resultado.

já na linha 20, fazemos o uso de paramento para buscar somente 1 registro da base de dados passando o numero do ID e retornando o resultado em JSON.

Na linha 24, fazemos um post para cadastrar uma nova JUG fazendo o uso do método bodyAsClass(Object) que converter o corpo do json ao objeto (java / kotlin) e logo em seguida salva no banco e retorna uma mensagem em JSON fazendo o uso da Classe ResponseModel com dois argumentos, código e mensagem.

Na linha 33 , basicamente é a mesma coisa do método post, porém utilizado para atualizar o registro no banco .

Já linha 42, deletamos um registro fazendo uma busca pelo id, trazendo o dado referente ao ID passado e em seguida ele entra no if para verificar se o status é igual a 200 e devolver uma mensagem para o usuário .

apos isso podemos fazer build de nossa aplicação com o comando :

mvn clean package

após isso dentro da pasta target terá o seguinte conteúdo :

a pasta dependency-jars contem as libs que utilizamos no nosso pom.xml, agora basta executar o jar com o comando :

java -jar Javalin-sample.jar

e fazer o uso conforme mostrado usando o PostMan :

também pode fazer uso de algum framework JavaScript como Angular para consumir a api como mostrada na imagem abaixo :

agora o passo final é subir para um provedor de Cloud, nosso eu optei pela plataforma da Oracle Cloud, por possuir conta na mesma.


Deploy no Oracle Application Container

Nesta parte faremos um deploy do nosso jar para a Oracle cloud, para isso o leitor(a) precisa ter uma conta Oracle Cloud, você pode usar o seguinte post para se familiarizar com o serviço Oracle Application Container.

Primeiro vamos fazer uma pequena mudança em nosso código, adicione o seguinte trecho a partir da linha 7 :

Na linha 6 , quando executado em algum provedor de Cloud, o numero da porta vai ser diferente de 8080, ou seja , vai ser randômico, por esse motivo usamos o System.getenv(“PORT”) para pegar a porta fornecida pela Oracle Application Container .

feita essa mudança faça o build novamente , volte para a pasta raiz do projeto e crie o manifest.json :

e em seguida crie e execute o seguinte script , caso estiver em um ambiente linux:

ao termino da sua executar na pasta raiz do seu projeto vai conter um arquivo zip contendo o seu jar, as dependências e o manifest.json .

Caso use Windows, basta criar um arquivo zip contento esse três elementos.

Agora faça login em sua conta Oracle e entre no serviço Oracle Application Contêiner e criar uma aplicação Java SE , passando o arquivo zip conforme a imagem :

feito isso,basta clicar em create e aguardar o upload do zip e a criação da instancia.

depois de pronta, a mesma ira ficar semelhante a imagem :

bastando acessar a URL apresentada e ao final adicioanr jugs.

Bem isso é tudo, espero que os leitores tenham gostado de conhecer um novo framework para construções de serviços Rest rapidamente como alternativa ao JAX-RS e Spring-Rest.

Código-fonte : https://github.com/Daniel-Dos/DanielDiasjava-Blog/tree/master/Projeto-Cloud/javalin/javalin-cloud

Front-End : https://github.com/Daniel-Dos/DanielDiasjava-Blog/tree/master/Projeto-Cloud/javalin/app-jug

REFERÊNCIAS