Criando uma aplicação REST com SparkJava

Spark_Java_Logo
SparkJava-Logo

Neste post veremos como podemos utilizar o micro-framework SparkJava para criamos api’s rest rapidamente.

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

Introdução ao SparkJava

SparkJava é um micro framework para criação de aplicações web em Kotlin e Java 8 com mínimo de esforço.

A intenção da Spark é fornecer uma alternativa para os desenvolvedores de Kotlin / Java que desejam desenvolver suas aplicações web tão expressivas quanto possível. Com uma filosofia clara, a Spark foi projetada não só para torná-lo mais produtivo, mas também para melhorar o seu código sob a influência da sintaxe elegante, declarativa e expressiva da Spark.

Com a onda de microservice que a grande maioria utilizar Spring Rest ou até mesmo soluções Java EE com Jersey/RestEasy, o Spark não fica de fora dessa onda, a mesma fornece uma API REST pronta para atender a JSON em menos de dez linhas de código.

Spark é usado principalmente para criar APIs REST, mas também oferece suporte a uma infinidade de template engines como :

Algo importante a se citar , não confundi com Apache Spark, apesar do mesmo nome, tem objetivos diferentes.

vejamos um simples Hello-World :

agora no navegador basta usar http://localhost:4567/hello e pronto.

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 agora a classe que retorna um código e uma mensagem de resposta de sucesso ou erro durante o uso da api :

agora criaremos duas classes produtoras utilizando o CDI, uma das classe é para o EntityManager — JPA e uma para JSON-B :

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: Os Producer Methods são apenas métodos que produzem objetos que serão administrados pelo container CDI e injetados em outros objetos.

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.

Com os nossos produtores feitos, faremos a parte de persistência de dados utilizando o DeltaSpike-Data.

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

em seguida criaremos uma classe uma classe utilitária que ira usar o ResponseTransformer do Spark que transformam as rotas mapeadas a saída do método do identificador. Isso é feito estendendo o objeto ResponseTransformer e passando para o método de mapeamento. Exemplo de uma rota que transforma a saída para JSON usando o Json-B :

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

esse é a nossa classe principal para executarmos o nosso serviço, como pode ser visto não foi utilizado o metodo main como foi demostrado no exemplo do hello-world, neste caso a aplicação vai ser executada pelo conteiner do CDI, então irei explicar algumas partes do codigo :

Nas linhas 24 a 31 utilizamos a anotação @Inject para injetarmos nossas dependencias.

Na linha 33 temos um metodo 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 declara no pom.xml na linha 89 .

Logo em seguida na linha 35 declaramos um metodo estatico port() passando o 8080 como a porta a ser utilizada na aplicação que por default é 4567 , em seguida tambem declaramos uma chamada de uma classe e o seu metodo estatico que habilita um filtro CORS para nossa aplicação poder ser usada em outros dominios, o conteudo da classe será mostrado depois .

Na linha 38 é onde começamos de fato a nossa api Rest, no SparkJava é chamado de Routes, nossa primeira rota é o Path, assim como no Jax-RS que é o equivalente ao @Path(“”) e no Spring RequestMapping(“”) .

logo depois temos as rotas Post,get,put e delete nas linhas 40 a 75 passando como paramentro o caminho para ser acessado, bem como os callback para request e response. Como pode ser visto estamos utilizando o lambda do Java, dentro dela temos setado o tipo de conteudo que a api ira responder, no caso setamos para Json.

Em seguida declaramos um objeto JUG que recebe a variavel json.fromJson() do JSON-B para a mesma fazer a serialização de Json para objeto do tipo JUG e dentro desse metodo chamamos o req.body() que é o corpo de solicitação enviado pelo cliente, lego depois esse objeto é salvo no banco de dado H2 e depois retorna uma mensagem e um codigo em Json atraves da classe ResponseModel que foi feita a transformação atraves da chamada do metodo jsonTransformer que foi comentada algumas linhas acima.

isso em JAX-RS seria :

Na linha 56 tenho um get com parametros para codigo, que o mesmo é pega utilizando o req.params(“codigo”); , traduzindo isso para Jax-RS é o equivalente a :

e para finalizar vejamos como fica a classe CorsFilter.enableCORS(); :

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

mvn clean package

apos isso dentro da pasta target tera o seguinte conteúdo :

spark

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

java -jar SparkJava-sample.jar

e fazer o uso conforme mostrado usando o PostMan :

post

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

front

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/SouJava-Rio/soujava-rio-labs/tree/master/spark-samples/CRUD-Deltaspike-CDI-Angular

Front-End : https://github.com/SouJava-Rio/soujava-rio-labs/tree/master/spark-samples/CRUD-Deltaspike-CDI-Angular/app-jug

Imagem Docker : https://hub.docker.com/r/danieldiasjava/sparkjava-crud/

REFERÊNCIAS