Light Mode

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

fabiodelgadopereira/SpringBootApp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

15 Commits

Repository files navigation

Autor: Fabio Delgado

Ola! Seja bem vindo ;)

Indice

  1. SpringBootApp
  2. Projeto e Conteudo
  3. Swagger
  4. JWT
  5. SQL Server e JDBC
  6. SMTP
  7. Testes unitarios (jUnit e JaCoCo))
  8. Publicacao
  9. Suporte

SpringBootApp

Este repositorio contem um exemplo de APIs REST desenvolvida em JAVA utilizando o framework Spring Boot com SQL Server para armazenameto de dados

Pre-requisitos

JDK 1.8 + Maven 3.0 +

Como executar essa aplicacao?

  • Faca o download do zip ou clone o repositorio Git.
  • Descompacte o arquivo zip (caso tenha baixado o .zip)
  • Abra o diretorio Prompt de Comando e Altere (cd) para a pasta que contem pom.xml
  • Abra o visual code ou execute o comando via prompt code .
  • Pressione F5 para executar a aplicacao.

A aplicacao devera estar disponivel em seu navegador no endereco: http://localhost:8080/swagger-ui.html

Extensoes recomendadas para desenvolvimento no VSCODE

  • Java Extension Pack from Microsoft
  • Spring Boot Extension Pack from Pivotal
  • Spring Boot Dashboard from Microsoft
  • Lombok Annotations Support for VS Code from Gabriel Basilio Brito
  • Java Code Generators from Sohibe

Configurando o Java no Visual Studio Code

  • Pressione Ctrl+Virgula.
  • Procure por "java.home".
    Caso voce esteja usando a versao mais recente do vscode:
  • Digite no seu java path(Nao se esqueca de colocar no caminho em: " ").*
    Caso voce esteja em uma versao mais antiga do vscode:
  • Clique no lapis ao lado da linha que comeca com "java.home".
  • Clique em "Copy to settings".
  • Digite no seu java path(Nao se esqueca de colocar no caminho em: " ").*
  • Press Ctrl+S
    Se voce nao sabe o seu caminho java, digite which java no seu terminal (no Windows, observe o formato correto, e.g: "java.home": "C:/Program Files/Java/jdk-11.0.2")

Projeto e Conteudo

O Spring Boot e um projeto da Spring que veio para facilitar o processo de configuracao e publicacao de nossas aplicacoes. A intencao e ter o seu projeto rodando o mais rapido possivel e sem complicacao. Ele consegue isso favorecendo a convencao sobre a configuracao. Basta que voce diga pra ele quais modulos deseja utilizar (WEB, Template, Persistencia, Seguranca, etc.) que ele vai reconhecer e configurar.

Entedento a estrutura de projeto

Swagger

O Swagger e uma aplicacao open source que auxilia os desenvolvedores a definir, criar, documentar e consumir APIs REST; E composto de um arquivo de configuracao, que pode ser definido em YAML ou JSON; Fornece ferramentas para: auxiliar na definicao do arquivo de configuracao (Swagger Editor), interagir com API atraves das definicoes do arquivo de configuracao (Swagger UI) e gerar templates de codigo a partir do arquivo de configuracao (Swagger Codegen).

fonte: https://swagger.io/resources/webinars/getting-started-with-swagger/

A maneira mais facil de instalar e usar o Maven:

pom.xml

<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger2artifactId>
<version>2.9.2version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger-uiartifactId>
<version>2.9.2version>
dependency>

Exemplo de implementacao para testes

@EnableSwagger2
@RestController
@RequestMapping(value="/api")
public class MainController {


@GetMapping(value="/ola")
public String getMethodName(){
return "Ola mundo";
}

JWT

O JWT (JSON Web Token) nada mais e que um padrao (RFC-7519) de mercado que define como transmitir e armazenar objetos JSON de forma simples, compacta e segura entre diferentes aplicacoes, muito utilizado para validar servicos em Web Services pois os dados contidos no token gerado pode ser validado a qualquer momento uma vez que ele e assinado digitalmente.

JSON Web Tokens (JWT) e um padrao stateless porque o servidor autorizador nao precisa manter nenhum estado; o proprio token e sulficiente para verificar a autorizacao de um portador de token.

Os JWTs sao assinados usando um algoritmo de assinatura digital (por exemplo, RSA) que nao pode ser forjado. Por isso, qualquer pessoa que confie no certificado do assinante pode confiar com seguranca que o JWT e autentico. Nao ha necessidade de um servidor consultar o servidor emissor de token para confirmar sua autenticidade.

fonte: https://jwt.io/introduction/

pom.xml

<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwtartifactId>
<version>0.9.1version>
dependency>

Encode

try {
Algorithm algorithm = Algorithm.HMAC256("secret");
String token = JWT.create()
.withIssuer("auth0")
.sign(algorithm);
} catch (JWTCreationException exception){
//Invalid Signing configuration / Couldn't convert Claims.
}

Verify a Token

String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
try {
Algorithm algorithm = Algorithm.HMAC256("secret");
JWTVerifier verifier = JWT.require(algorithm)
.withIssuer("auth0")
.build(); //Reusable verifier instance
DecodedJWT jwt = verifier.verify(token);
} catch (JWTVerificationException exception){
//Invalid signature/claims
}

SQL Server e JDBC

JDBC e semelhante ao ODBC, e no principio usava justamente ODBC para conectar-se com o banco de dados. A partir de um codigo nativo as aplicacoes Java podiam utilizar qualquer banco de dados que tivesse um driver ODBC disponivel. Isso contribuiu bastante para a popularizacao do JDBC uma vez que existe um driver ODBC para praticamente qualquer banco de dados de mercado. Nesse repositorio sera utilizado o JDBC para comunicacao com o banco de dados e execucao de comandos atraves de store procedures.

Stored Procedure, que traduzido significa Procedimento Armazenado, e uma conjunto de comandos em SQL que podem ser executados de uma so vez, como em uma funcao. Ele armazena tarefas repetitivas e aceita parametros de entrada para que a tarefa seja efetuada de acordo com a necessidade individual. Nesse projeto foram desenvolvidos. As Stored Procedures implementadas nesse projeto sao:

  • sp_Clientes_InsertValue
  • sp_Clientes_GetValueById
  • sp_Clientes_GetAllValues
  • sp_Clientes_DeleteValue

Configurando o ambiente TCP para SQL Server

  1. No menu Iniciar, abra o SQL Server 2014 Configuration Manager.
  2. Clique em Protocolo para SQLEXPRESS em SQL Server Network Configuration no painel esquerdo. No painel direito, clique com o botao direito do mouse em TCP / IP e selecione Propriedades.
  3. Na caixa de dialogo Propriedades de TCP / IP, clique na guia Enderecos IP.
  4. Role para baixo para localizar o IPALL. Remova qualquer valor, se presente, para portas dinamicas TCP e especifique 1433 para porta TCP port.

  1. Clique OK.
  2. Novamente, clique com o botao direito do mouse em TCP / IP no painel direito e selecione Ativar.
  3. No Servicos do SQL Server, clique com o botao direito do mouse em SQL Server (SQLEXPRESS) e selecione Reiniciar.

Firewall

  • Para validar se a porta do servido esta liberada, execute o comando telnet localhost 1433
  • Para validar se o servico esta no ar, execute o comando sc query mssqlserver
  • Para validar as conexoes na porta, execute o commando netstat -ano | find "1433"

A maneira mais facil de instalar e usar o Maven:

pom.xml

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>5.2.6.RELEASEversion>
dependency>

Exemplo de implementacao para testes

application.properties

spring.datasource.initialization-mode=always
spring.datasource.platform=@database.platform@

spring.datasource.url=jdbc:sqlserver://{{servidor}};databaseName={{base_de_dados}};integratedsecurity=true
spring.datasource.username={{usuario}}
spring.datasource.password={{senha}}
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver

repository.java

@Repository
public class ClienteRepository {

private static final String SQL_FIND_ALL = "SELECT @@version;";

private static final BeanPropertyRowMapper<Cliente> ROW_MAPPER = new BeanPropertyRowMapper<>(Cliente.class);

@Autowired
NamedParameterJdbcTemplate jdbcTemplate;

public Iterable<Cliente> findAll() {
return jdbcTemplate.query(SQL_FIND_ALL, ROW_MAPPER);
}

Server-Side Paging

Em muitos casos - por exemplo, ao trabalhar com conjuntos de dados muito grandes - nao buscamos na base de dados toda a colecao completa e armazenamos na memoria. Nesse caso e usar algum tipo de paginacao no servidor, onde o servidor envia apenas uma unica pagina de cada vez. Esse e um objeto json de resposta do servidor para casos como esses:

SMTP

O SMTP ou Simple Mail Transfer Protocol, e uma convencao padrao dedicada ao envio de e-mail. A principio o protocolo SMTP utilizava por padrao a porta 25 ou 465 (conexao criptografada) para conexao, porem a partir de 2013 os provedores de internet e as operadoras do Brasil passaram a bloquear a porta 25, e comecaram a usar a porta 587 para diminuir a quantidade de SPAM. O SMTP e um protocolo que faz apenas o envio de e-mails, isso significa que o usuario nao tem permissao para baixar as mensagens do servidor, nesse caso e necessario utilizar um Client de e-mail que suporte os protocolos POP3 ou IMAP como o Outlook, Thunderbird e etc. Para negocios ou empresas pequenas com baixo volume de e-mails, o servidor SMTP gratuito do Google pode ser uma otima solucao e voce pode usar o Gmail para enviar o seu e-mail. Eles possuem uma infraestrutura gigante e voce pode confiar nos servicos deles para ficar online. Porem, mesmo sendo completamente gratis, tudo tem um limite. De acordo com a documentacao do Google, voce pode enviar ate 100 e-mails a cada periodo de 24 horas quando envia atraves do servidor SMTP deles. Ou voce tambem pode pensar nisso como sendo 3 mil e-mails por mes gratuitamente.Dependendo de quantos e-mails voce envia ou do tamanho do seu negocio, isto pode ser mais do que suficiente. Se voce envia mais de 5 mil e-mails por mes, voce vai preferir usar um servico de e-mail transacional de terceiros ou um servico premium.

Nesse projeto foi utilizado o spring-boot-email-core para envio de e-mail via SMTP e os testes foram feitos utilizando o servico do mailtrap.io.

Para instalar o spring-boot-email-core utilize o commando abaixo: pom.xml

<dependency>
<groupId>it.ozimovgroupId>
<artifactId>spring-boot-email-coreartifactId>
<version>0.6.3version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-mailartifactId>
dependency>

application.properties

spring.mail.host=smtp.mailtrap.io
spring.mail.port=2525
spring.mail.username=xxxxxxx
spring.mail.password=xxxxxxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

Exemplo de implementacao:

@PostMapping(value="/Contato")
public String postCliente(@RequestBody @Valid Contato contato){

// Create a mail sender
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(this.emailConfig.getHost());
mailSender.setPort(this.emailConfig.getPort());
mailSender.setUsername(this.emailConfig.getUsername());
mailSender.setPassword(this.emailConfig.getPassword());

// Criando um e-emil
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setFrom(contato.getEmail());
mailMessage.setTo("rc@feedback.com");
mailMessage.setSubject("New feedback from " + contato.getNome());
mailMessage.setText(contato.getMensagem());

// Enviar e-mail
mailSender.send(mailMessage);
return String.format("Mensagem enviada com sucesso!");
}

Testes unitarios (jUnit e JaCoCo)

Teste de unidade e toda a aplicacao de teste nas assinaturas de entrada e saida de um sistema. Consiste em validar dados validos e invalidos via I/O (entrada/saida) sendo aplicado por desenvolvedores ou analistas de teste. Uma unidade e a menor parte testavel de um programa de computador. Em programacao procedural, uma unidade pode ser uma funcao individual ou um procedimento. Idealmente, cada teste de unidade e independente dos demais, o que possibilita ao programador testar cada modulo isoladamente. JUnit e uma frameword de teste de unitarios para a linguagem de programacao Java. JUnit tem sido importante no desenvolvimento TDD e faz parte de uma familia de estruturas de teste de unidade que e coletivamente conhecida como xUnit que se originou com SUnit. JaCoCo e uma biblioteca de cobertura de codigo gratuita para Java, que foi criada pela equipe EclEmma com base nas licoes aprendidas com o uso e integracao de bibliotecas existentes por muitos anos.

Para instalar o JUnit e JaCoCo utilize o commando abaixo: pom.xml

<dependency>
<groupId>org.junit.jupitergroupId>
<artifactId>junit-jupiter-apiartifactId>
<version>5.6.2version>
<scope>testscope>
dependency>
...
<plugin>
<groupId>org.jacocogroupId>
<artifactId>jacoco-maven-pluginartifactId>
<version>0.8.3version>
<executions>
<execution>
<id>prepare-agentid>
<goals>
<goal>prepare-agentgoal>
goals>
execution>
<execution>
<id>reportid>
<phase>prepare-packagephase>
<goals>
<goal>reportgoal>
goals>
execution>
<execution>
<id>post-unit-testid>
<phase>testphase>
<goals>
<goal>reportgoal>
goals>
<configuration>


<dataFile>target/jacoco.execdataFile>

<outputDirectory>target/my-reportsoutputDirectory>
configuration>
execution>
executions>
<configuration>
<systemPropertyVariables>
<jacoco-agent.destfile>target/jacoco.execjacoco-agent.destfile>
systemPropertyVariables>
configuration>
plugin>
plugins>

Exemplo de classe teste:

import com.cliente.springboot.model.Contato;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

class SpringbootApplicationTests {

@Test
void contextLoads() {
Contato con = new Contato("zaphod", "zaphod@mail.com","mensagem");
assertEquals(con.getNome(),"zaphod");
}

}

Suporte

Por favor entre em contato conosco via [Email]

About

Este repositorio contem um exemplo de APIs REST desenvolvida em JAVA utilizando o framework Spring Boot com SQL Server para armazenameto de dados

Topics

Resources

Readme

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors