1
resposta

[Dúvida] Problemas após adicionar o Spring Security no projeto.

No curso "Spring Boot 3: aplique boas práticas e proteja uma API Rest", aula 0.3 sobre Spring Security, após adicionar o Spring Security o projeto começou a dar erro.

Primeiro começou a apresentar um erro ao rodar o projeto:

java: cannot find symbol symbol: method getId() location: variable medico of type med.voll.api.domain.medico.Medico

Assim, resolvi implementar os Getter E Setter e esse erro sumiu e o projeto voltou a rodar normalmente.

Porém, quanto tento fazer o login, no navegador, em http://localhost:8080/medicos, não loga e aparece esse erro;

Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.

Thu Mar 20 18:10:55 BRT 2025 There was an unexpected error (type=Internal Server Error, status=500). No default constructor for entity 'med.voll.api.domain.medico.Medico'

2025-03-20T18:12:53.398-03:00 ERROR 10040 --- [api] [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.orm.jpa.JpaSystemException: No default constructor for entity 'med.voll.api.domain.medico.Medico'] with root cause

org.hibernate.InstantiationException: No default constructor for entity 'med.voll.api.domain.medico.Medico'

Repito: Na aula anterior, tudo funcionava perfeitamente.

É muito complicado estudar assim, sem um local mais objetivo, rápido e prático para tirar dúvidas. A IA nem sempre ajuda.

1 resposta

Quando você adiciona o Spring Security ao seu projeto, ele passa a proteger todos os endpoints da sua aplicação, a menos que você configure explicitamente exceções para alguns deles (como as URLs de login ou outras rotas públicas).

No seu caso, ao tentar acessar o endpoint /medicos, o Spring Security está provavelmente tentando proteger essa URL e você não está autenticado, o que leva ao erro de Whitelabel Error Page. A solução seria garantir que esse endpoint esteja configurado corretamente para ser acessado sem autenticação ou garantir que a autenticação seja realizada corretamente antes de acessar o endpoint.

Se o endpoint /medicos deve ser acessado sem autenticação, você precisa configurar o Spring Security para permitir o acesso público a esse URL.

No arquivo de configuração do Spring Security (geralmente uma classe que estende WebSecurityConfigurerAdapter), você pode permitir que esse endpoint seja acessado sem autenticação:

import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
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;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers(HttpMethod.GET, "/medicos").permitAll() // Permite acesso público ao endpoint /medicos
            .anyRequest().authenticated() // Exige autenticação para outros endpoints
        .and()
        .formLogin()
            .loginPage("/login") // Se houver uma página de login personalizada
            .permitAll() // Permite acesso público à página de login
        .and()
        .logout()
            .permitAll(); // Permite logout sem autenticação
}
}