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

[Bug] Injection of autowired dependencies failed

Olá!

Depois que eu fiz as alterações para configurar os perfis de acesso sugeridos no link https://cursos.alura.com.br/forum/topico-bug-duvidas-para-configurar-permissoes-para-utilizar-h2-erro-403-392991, estou tomando o erro abaixo para subir a aplicação, quando injetei as dependências na classe LoginController, que eu criei depois.

package com.plano.saude.cadastro.controller;

import com.plano.saude.cadastro.domain.usuario.DadosAutenticacao;
import com.plano.saude.cadastro.domain.usuario.DadosCadastroUsuario;
import com.plano.saude.cadastro.domain.usuario.DadosUsuario;
import com.plano.saude.cadastro.domain.usuario.Usuario;
import com.plano.saude.cadastro.domain.usuario.UsuarioService;
import com.plano.saude.cadastro.infra.security.DadosToken;
import com.plano.saude.cadastro.infra.security.TokenService;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/login")
public class LoginController {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private TokenService tokenService;

    @Autowired
    private UsuarioService usuarioService;

    @PostMapping
    public ResponseEntity efetuateLogin(@RequestBody @Valid DadosAutenticacao dados){
        try {
            var authenticationToken = new UsernamePasswordAuthenticationToken(dados.login(), dados.password());
            var authentication = authenticationManager.authenticate(authenticationToken);

            var tokenJWT = tokenService.generateToken((Usuario) authentication.getPrincipal());

            return ResponseEntity.ok(new DadosToken(tokenJWT));
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }

    @PostMapping
    @Transactional
    public ResponseEntity<DadosUsuario> register(@RequestBody @Valid DadosCadastroUsuario dados) {
        var usuario = this.usuarioService.cadastrar(dados);
        return ResponseEntity.ok(usuario);
    }
}

Eu tentei ajustar e revisar onde está o erro, mas não consegui encontrar, mas vou colocar aqui o trecho da stack que está reclamando, para verificar para me ajudarem, por favor Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

5 respostas
solução!

Oi!

O erro é porque no seu controller LoginController existe ambiguidade. Tem dois métodos mapeados para a mesma url e com o mesmo verbo HTTP Post.

Uma solução é mudar a url do método de cadastro:

@PostMapping("register")
@Transactional
public ResponseEntity<DadosUsuario> register(@RequestBody @Valid DadosCadastroUsuario dados) {
    var usuario = this.usuarioService.cadastrar(dados);
    return ResponseEntity.ok(usuario);
}

Dessa forma ficará assim:

  • POST /login -> requisição para efetuar login
  • POST /login/register -> requisição para cadastrar usuario

É verdade, não tinha visto esse detalhe.

Obrigado, professor!

Só que agora eu não consigo gerar token com nenhuma das duas formas, dando erro 500: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeDepois que eu ajustei o endpoint no controller: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

O de cadastro deu erro pq você enviou no json um email que já está cadastrado. O de login deu loop infinito. Manda um print da stacktrace no intellij

O de cadastro é verdade, não me atentei nesse detalhe. Mas como estou utilizando H2, eu não acertei como cadastrar usuário, porque sempre barra na condição abaixo. Colocando dados inexistentes, retorna erro 500, porque não insere na base. Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Quanto ao de login, sobre o erro, vou te mandar o print da stacktrace: Insira aqui a descrição dessa imagem para ajudar na acessibilidade