Recentemente comecei a falar sobre como migrar sua API Java para Kotlin. Para isso, 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, quanto 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;
- indByBrand() -> 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:
Claro que esta é apenas uma forma de inserir nossos objetos no banco de dados.
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 artigo, o link está aqui.
Tem alguma dúvida ou sugestão? Aproveite os campos abaixo.
Até a próxima.
***
Artigo originalmente publicado em: https://www.concretesolutions.com.br/2017/05/12/api-java-kotlin-spring-boot-2/