Concrete Logo
Hamburger button

Migrando sua API Java para Kotlin com Spring Boot – Parte 2

  • Blog
  • 12 de Maio de 2017
Share

Na última quarta, comecei a falar aqui no Blog sobre como migrar sua API Java para Kotlin, criamos uma aplicação Java e fizemos alguns testes. Hoje, vamos definitivamente ao código! Vamos criar outra POC desenvolvendo o mesmo projeto, mas na linguagem de programação Kotlin.

Pré-requisitos:

– Os mesmos do projeto que desenvolvemos em Java =).

Vamos então voltar para o site do Spring Initializr para escolher as dependências que vamos usar para criar nosso projeto Kotlin. Usaremos as mesmas selecionadas para o projeto Java, porém deveremos alterar o contexto da linguagem na configuração Language para Kotlin.

Assim que o download do projeto for feito, abra-o em sua IDE e aguarde as importações serem concluídas. Com o projeto devidamente baixado e configurado em nossa IDE, vamos aos próximos passos.

Criar a classe Car. Podemos criar perfeitamente um package para nosso arquivo que os imports funcionam da mesma forma que em Java, mas tome cuidado na hora de escolher o tipo de arquivo, pois a IDE pode te dar a opção tanto de .java quando de .kt, ok? Lembra do que foi dito acima, que as linguagens podem perfeitamente ser integradas? Pois é, a IDE deixa isso em aberto, possibilitando perfeitamente a criação de ambas, veja:

No construtor da classe vamos declarar nossos atributos id, brand e model, juntamente com seus tipos. Mas atenção: em Kotlin não declaramos Getters e Setters. E para que nossa classe tenha esses métodos, devemos declará-la como uma data class. Dessa forma ela terá os getters, setters, toString e equals/hashcode. Calma, não se assuste com a questão do encapsulamento e da imutabilidade. Podemos definir na declaração dos atributos quais deles poderão ser visíveis fora da classe. Isso é possível com o prefixo val. Dessa forma, podemos dizer que nossa classe estará bem encapsulada e apenas os métodos getters estarão acessíveis. Em Java isso seria equivalente a criar um método setter e deixá-lo como Private. Caso seja necessário que os atributos tenham o setter, podemos usar o prefixo var na declaração da classe.

Como vamos trabalhar com o banco de dados Mongo e essa nossa data class será uma Entity, vamos utilizar a annotation @Document que indicará ao framework para criar essa estrutura de tabela no banco.

No final nossa classe ficará assim:

Vamos criar um package chamado repository e dentro dele uma interface que vou chamar de CarRepository.

Nossa interface vai extender MongoRepository, mas note que não utilizamos a palavra reservada extends, mas dois pontos “ : ” . Dentro dela vamos criar três métodos:

all() -> listará todos os carros;
findByBrand() -> que listará por marca;
findByModel()-> que listará por modelo.

Agora vamos ao nosso controller. Vamos criar três endpoints para pesquisar os dados que inserimos no banco de dados. Reparou que não estamos utilizando “;” no final das expressões? Em Kotlin o uso é opcional.

Então, nosso Controller fica assim:

Obs: Classes e Métodos em Kotlin que não possuem seu modificador aberto e por padrão são Final. Para mudar isso, devemos utilizar o identificador Open e torná-los públicos.

O que achou? Veja que recebemos no construtor da classe uma @Injection ou um @Autowired de nosso repositório. That’s funny?? =) Com exceção do método findAll(), para obter os valores da pesquisa pela marca e pelo modelo, vamos passar no Body da requisição nosso campo chave para pesquisa e deveremos receber uma lista de objetos como resposta.

Pronto… vamos agora inserir algumas informações em nosso banco de dados MongoDB e testar nossos serviços. Para isso vamos criar um Bean em nossa classe principal que vai implementar a interface CommandLineRunner e inserir nossos dados. A classe ficará assim:

Agora vamos rodar pela primeira vez nosso projeto. (No IntelliJ) clique com o botão direito na classe principal e em seguida na opção “create ‘br.com.concretesoluti….’ ”

Em seguida, nas configurações de Run do projeto, marque a opção “Single instance only” e OK.

Agora sim, botão direito e “Run”. Acompanhe a saída do console, de cara deverá listar os carros que adicionamos:

Pronto…. Primeira etapa concluída.

Vamos garantir que nossos carros estão de fato em nosso banco de dados. No terminal, vamos acessar o console do Mongo:

Em seguida vamos executar um Select em nossa tabela Car e verificar o conteúdo dela:

Legal! De fato temos as informações no nosso banco de dados. Agora mãos à obra para testarmos nossos endpoins.

Vamos testar primeiro o endpoint (“/”) . No terminal ou no browser (caso utilize o browser recomendo a instalação do plugin para o Chrome chamado “jsonViewer”.) Com isso a formatação de nosso Json ficará pretty good!

Vou fazer o teste utilizando o terminal. Uso o comando “curl -H ‘Content-Type: application/json’ http://localhost:8080 | json_pp “ (e json_pp) para formatar legal nossa saída =) O resultado:

Legal, nosso primeiro serviço está ok. Agora vamos ao próximo. Vamos listar nossos carros pela marca. Lembra do endereço do nosso endpoint? Nossa chamada fica assim:

“curl -X POST http://localhost:8080/brand -H ‘Content-Type: application/json’ -d ‘{“brand”:”VW”}’ | json_pp”

E finalmente nossa pesquisa pelo modelo do veículo:

“curl -X POST http://localhost:8080/model -H ‘Content-Type: application/json’ -d ‘{“model”:”A3″}’ | json_pp”

E é isso aí! o que acharam desse pequeno exemplo? Usar ou não usar? Fica a cargo de cada um.

Não existem ainda comparações sobre performance do Kotlin em relação ao Java ou outras linguagens. No geral as linguagens de programação por si só tendem a ser altamente performáticas, o que pode deixá-las com baixa performance são os desenvolvedores, na forma em que o código é escrito e como os recursos são utilizados.

Aqui tem um texto legal sobre Java e Kotlin, se você quiser estudar mais.

E aqui está o site oficial do Kotlin, que tem vários exemplos práticos e tutoriais de utilização da linguagem.

Caso queiram baixar o código fonte do exemplo deste post o link está aqui.

Tem alguma dúvida ou sugestão? Aproveite os campos abaixo. Até a próxima =)

É desenvolvedor Java e quer fazer parte de um time fantástico? Clique aqui.