Detalhamentos das bibliotecas usadas no projeto
1. Spring Boot Starter Data JPA
Teoria
O Spring Boot Starter Data JPA é uma biblioteca que facilita a implementação de persistência de dados em aplicações Java através da Java Persistence API (JPA). Ele oferece abstrações e implementações para acessar dados de forma mais simples, utilizando repositórios.
Utilidade
-
Abstração da Persistência: Permite que os desenvolvedores interajam com bancos de dados sem escrever SQL diretamente.
-
Facilidade de Uso: Com repositórios, você pode realizar operações CRUD (Create, Read, Update, Delete) com poucas linhas de código.
-
Integração com Hibernate: O Hibernate é o provedor JPA padrão, que oferece ferramentas e funcionalidades avançadas.
Exemplo de Uso
1.1. Configuração no application.properties:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
1.2. Entidade:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters e Setters
}
1.3. Repositório:
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
}
1.4. Serviço:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> getAllUsers() {
return userRepository.findAll();
}
public User createUser(User user) {
return userRepository.save(user);
}
}
1.5. Controlador:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<User> getUsers() {
return userService.getAllUsers();
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
}
2. Spring Boot Starter Security
Teoria
O Spring Boot Starter Security fornece suporte para autenticação e autorização em aplicações. Utiliza o Spring Security, que é um framework robusto e amplamente utilizado para proteger aplicações Java.
Utilidade
-
Autenticação: Verifica a identidade do usuário.
-
Autorização: Controla o acesso a recursos com base nas permissões do usuário.
-
Segurança Personalizável: Permite a configuração de segurança de acordo com as necessidades da aplicação.
Exemplo de Uso
2.1. Configuração de Segurança:
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Permitir acesso público
.anyRequest().authenticated() // Requer autenticação para qualquer outra requisição
.and()
.formLogin(); // Habilitar login baseado em formulário
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
3. Spring Boot Starter Web
Teoria
O Spring Boot Starter Web é uma biblioteca que facilita a construção de aplicações web, incluindo serviços RESTful, utilizando o Spring MVC. Ele traz todas as dependências necessárias para desenvolvimento web.
Utilidade
-
Facilidade na Criação de APIs: Permite a criação de endpoints REST de maneira rápida.
-
Suporte a Templating: Integra-se com bibliotecas de templating como Thymeleaf.
-
Gerenciamento de Requisições e Respostas: Facilita a manipulação de HTTP.
Exemplo de Uso
3.1. Controlador:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<User> getUsers() {
return userService.getAllUsers();
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
}
4. Spring Boot DevTools
Teoria
O Spring Boot DevTools é um conjunto de ferramentas que aprimora a experiência de desenvolvimento. Ele permite que a aplicação reinicie automaticamente quando mudanças são detectadas.
Utilidade
- Recarregamento Automático: Facilita o desenvolvimento, pois você não precisa reiniciar a aplicação manualmente.
- Melhorias na Experiência de Desenvolvimento: Habilita configurações que simplificam o fluxo de trabalho de desenvolvimento.
Exemplo de Uso
4.1. Configuração:
Basta adicionar a dependência no pom.xml e, em seguida, executar a aplicação. Ao fazer alterações no código, a aplicação será reiniciada automaticamente.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
5. H2 Database
Teoria
O H2 é um banco de dados relacional leve que pode ser executado em memória e é usado principalmente para desenvolvimento e testes. Ele é fácil de configurar e não requer instalação.
Utilidade
-
Teste Rápido: Ideal para testes unitários e desenvolvimento rápido.
-
Sem Configuração Complexa: Basta configurar o JDBC para usar.
-
Console Web: Oferece um console web para interagir com o banco de dados.
Exemplo de Uso
5.1. Configuração no application.properties:
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
5.2. Acesso ao Console H2:
Acesse o console em http://localhost:8080/h2-console após iniciar a aplicação.
6. PostgreSQL
Teoria
PostgreSQL é um sistema de gerenciamento de banco de dados relacional objeto (ORDBMS) que é amplamente utilizado por suas robustas funcionalidades e conformidade com padrões.
Utilidade
-
Suporte a Transações: Gerencia transações complexas com segurança.
-
Escalabilidade: Capaz de lidar com grandes volumes de dados.
-
Extensibilidade: Permite a criação de tipos de dados personalizados.
Exemplo de Uso
6.1. Configuração no application.properties:
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=myuser
spring.datasource.password=mypassword
spring.jpa.hibernate.ddl-auto=update
6.2. Conexão ao Banco:
Certifique-se de que o servidor PostgreSQL esteja em execução e que o banco de dados e as credenciais estejam corretos.
7. Lombok
Teoria
Lombok é uma biblioteca que ajuda a reduzir a quantidade de código boilerplate, como getters, setters, construtores e métodos toString, através de anotações.
Utilidade
-
Reduzir Código Boilerplate: Facilita a escrita de classes de modelo.
-
Facilita a Manutenção: Menos código resulta em menos erros e facilita a manutenção.
Exemplo de Uso
7.1. Model com Lombok:
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
@Data // Gera automaticamente métodos getters e setters
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
}
8. Spring Boot Starter Test
Teoria
O Spring Boot Starter Test fornece todas as dependências necessárias para realizar testes em aplicações Spring Boot, incluindo JUnit, Mockito e Spring Test.
Utilidade
-
Facilidade na Criação de Testes: Simplifica a configuração de testes unitários e de integração.
-
Suporte a Testes de Componentes Spring: Permite testar facilmente componentes do Spring.
Exemplo de Uso
8.1. Teste Unitário:
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetUsers() throws Exception {
mockMvc.perform(get("/users"))
.andExpect(status().isOk());
}
}
9. Spring Security Test
Teoria
O Spring Security Test fornece funcionalidades para testar a segurança de aplicações Spring, permitindo simular usuários autenticados e verificar o controle de acesso.
Utilidade
-
Testes de Segurança Simplificados: Facilita a criação de testes que verificam a segurança da aplicação.
-
Simulação de Usuários: Permite simular usuários com diferentes roles e permissões.
Exemplo de Uso
9.1. Teste de Segurança:
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;
@WebMvcTest(UserController.class)
public class UserControllerSecurityTest {
@Autowired
private MockMvc mockMvc;
@Test
@WithMockUser // Simula um usuário autenticado
public void testGetUsersWithAuthentication() throws Exception {
mockMvc.perform(get("/users"))
.andExpect(status().isOk());
}
@Test
public void testGetUsersWithoutAuthentication() throws Exception {
mockMvc.perform(get("/users"))
.andExpect(status().isUnauthorized());
}
}
10. Auth0 Java JWT
Teoria
O Auth0 Java JWT é uma biblioteca que facilita a manipulação de tokens JWT (JSON Web Tokens) em aplicações Java. Os JWTs são amplamente utilizados para autenticação e troca de informações seguras entre partes.
Utilidade
-
Geração de Tokens: Permite criar tokens JWT para autenticar usuários.
-
Validação de Tokens: Fornece funcionalidades para verificar a autenticidade e integridade dos tokens.
-
Manipulação de Claims: Facilita a inclusão e leitura de claims no token, que são informações adicionais.
Exemplo de Uso
10.1. Geração e Validação de JWT:
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
public class JwtUtil {
private static final String SECRET = "mySecretKey";
public String generateToken(String username) {
return JWT.create()
.withSubject(username)
.sign(Algorithm.HMAC256(SECRET));
}
public String validateToken(String token) {
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
DecodedJWT jwt = verifier.verify(token);
return jwt.getSubject();
}
}
11. Jackson Databind
Teoria
Jackson Databind é uma biblioteca do projeto Jackson que fornece funcionalidades para serialização e desserialização de objetos Java para JSON e vice-versa. É amplamente utilizada em aplicações que precisam interagir com APIs RESTful.
Utilidade
-
Serialização: Converte objetos Java em strings JSON.
-
Desserialização: Converte strings JSON em objetos Java.
-
Suporte a Anotações: Permite personalizar a serialização e desserialização com anotações.
Exemplo de Uso
11.1. Serialização e Desserialização:
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
private static final ObjectMapper objectMapper = new ObjectMapper();
public String serialize(Object obj) throws Exception {
return objectMapper.writeValueAsString(obj);
}
public <T> T deserialize(String json, Class<T> clazz) throws Exception {
return objectMapper.readValue(json, clazz);
}
}
12. Springdoc OpenAPI
Teoria
Springdoc OpenAPI é uma biblioteca que gera documentação automática para APIs REST baseadas em Spring. Ele utiliza a especificação OpenAPI para descrever os endpoints de uma aplicação, facilitando a integração e uso da API.
Utilidade
-
Documentação Automática: Gera documentação em tempo real a partir das anotações nas classes.
-
Interface Interativa: Proporciona uma interface gráfica para testar os endpoints da API.
-
Suporte a Versionamento: Facilita o gerenciamento de versões da API.
Exemplo de Uso
12.1. Configuração do Springdoc:
import org.springdoc.core.annotations.SpringDocConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@SpringDocConfig
public class OpenApiConfig {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("API Example")
.version("1.0")
.description("Documentação da API de exemplo"));
}
}