Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Erro ao executar o detalhamento de um tópico após a liberação do endpoint

Ao tentar executar o método GET para o detalhamento de um tópico, após a autorização de acesso, ocorreu erro. Seguem o código e o detalhamento do erro. Estou usando a versão 2.4.2 do Spring Boot.

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers(HttpMethod.GET, "/topicos").permitAll()
            .antMatchers(HttpMethod.GET, "/topicos/*").permitAll();    
    }
{
    "timestamp": "2021-02-23T23:14:51.162+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "trace": "org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.alura.forum.modelo.Topico.respostas, could not initialize proxy - no Session\r\n\tat 
...
    "message": "failed to lazily initialize a collection of role: br.com.alura.forum.modelo.Topico.respostas, could not initialize proxy - no Session",
    "path": "/topicos/1"

Consegui fazer a correção, incluindo a anotação @Transactional no método detalhar() na classe TopicosController.

    @GetMapping("/{id}")
    @Transactional
    public ResponseEntity<DetalhesDoTopicoDto> detalhar(@PathVariable Long id) {
        Optional<Topico> topico = topicoRepository.findById(id);
        if (topico.isPresent()) {
            return ResponseEntity.ok(new DetalhesDoTopicoDto(topico.get()));
        }
        return ResponseEntity.notFound().build();
    }

: )

4 respostas

Oi SUELY

Tenta colocar nas anotações @ManyToMany, principalmente do Topico.java que é onde tá dando erro

fetch=FetchType.EAGER

Dessa forma:

@ManyToMany(fetch=FetchType.EAGER)
private Set<Project> projects;

Veja se funciona

Olá, Otávio!

Obrigada pela sua resposta. Para mim, a inclusão da anotação @Transactional, no método detalhar() resolveu o problema.

A fim de deixar a informação para outras pessoas, que encontrem o mesmo problema, registrei o ocorrido no Fórum do curso.

Acredito que o erro possa ter sido causado pela diferença de versão do Spring Boot. Será?

: )

solução!

Oi Suely,

Na verdade não tem a ver com a versão do Spring.

O problema é que no seu controller você não está devolvendo um objeto DTO, mas sim a entidade Topico, que tem relacionamentos que não foram carregados pela JPA, causando a exception.

Bons estudos!

Obrigada pela ajuda, Rodrigo! : )